本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7640873.html,记录一下学习过程以备后续查用。

    一、引言

    从今天开始我们开始讲结构型设计模式,结构型设计模式有如下几种:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。

    创建型设计模式解决的是对象创建的问题,而结构型设计模式解决的是类和对象组合关系的问题。

    今天我们开始讲结构型设计模式里面的第一个设计模式:适配器模式。适配器模式其实很简单,在现实生活中有很多这样的实例实例:比如,手机充电器的接头是二插的,假如只有三插的插座,就必须通过三插转二插的转换器才可以正常充电;笔记本电脑的工作电压和家庭照明的电压是不一致的,需要通过变压器(俗称火牛)才能让笔记本电脑正常工作。适配器的例子数不胜数,只需记住一点:适配就是转换,让不能在一起工作的两样东西通过转换可以正常工作。

    二、适配器模式介绍

    适配器模式:英文名称--Adapter Pattern;分类--结构型。

    2.1、动机(Motivate)

    在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新的环境要求的接口是这些现存对象所不能满足的。如何应对这种“迁移的变化”?如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?

    2.2、意图(Intent)

    将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。--《设计模式》Gof

    2.3、结构图(Structure)

    适配器有两种结构:

    1)对象适配器(更常用)

C#设计模式学习笔记:(6)适配器模式

    对象适配器使用的是对象组合的方案,它的Adapter和Adaptee的关系是组合关系。

    OO中优先使用组合模式,组合模式不适用时再考虑继承,因为组合模式更加松耦合。而继承是紧耦合的,父类的任何改动都要导致子类的改动。

    2)类适配器

C#设计模式学习笔记:(6)适配器模式

    2.4、模式的组成

    从上两图可以看出,在适配器模式的结构图有以下角色:

    1)目标角色(Target):定义Client使用的与特定领域相关的接口。

    2)客户角色(Client):与符合Target接口的对象协同。

    3)被适配角色(Adaptee):定义一个已经存在并已经使用的接口,这个接口需要适配。

    4)适配器角色(Adapter) :适配器模式的核心,它将对被适配Adaptee角色已有的接口转换为目标角色Target匹配的接口并进行适配。

    2.5 、适配器模式的具体实现

    2.5.1对象适配器模式的实现

C#设计模式学习笔记:(6)适配器模式
    class Program
    {
        /// <summary>
        /// 目标角色(Target)--两孔插座,这里可以写成抽象类或者接口。
        /// </summary>
        public class TwoHoleTarget
        {
            //客户端需要的方法
            public virtual void Request()
            {
                Console.WriteLine("我需要两孔的插座。");
            }
        }

        /// <summary>
        /// 源角色(Adaptee)--三孔插座,需要适配的类。
        /// </summary>
        public class ThreeHoleAdaptee
        {
            public void SpecificRequest()
            {
                Console.WriteLine("增加三孔转两孔的插座,两孔充电器也可以使用了。");
            }
        }

        /// <summary>
        /// 适配器类
        /// </summary>
        public class ThreeToTwoAdapter : TwoHoleTarget
        {
            //创建三孔插座的实例
            private ThreeHoleAdaptee threeHoleAdaptee = new ThreeHoleAdaptee();

            /// <summary>
            /// 实现两孔插座接口方法
            /// </summary>
            public override void Request()
            {
                //具体的转换工作
                threeHoleAdaptee.SpecificRequest();
            }
        }

        static void Main(string[] args)
        {
            #region 适配器模式之对象适配器
            TwoHoleTarget twoHole = new ThreeToTwoAdapter();
            twoHole.Request();
            Console.ReadLine();
            #endregion
        }
    }
View Code

相关文章: