适配器模式---设计模式(12)

时间:2020-12-23 21:59:32

一、定义

适配器模式:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

解释:适配器模式好比一个电源适配器,生活中房间内的电压是220v,但是你的很多用电器就不是220v,比如电脑、手机等等,这是需要电源适配器来调节电压,使用电源适配器充电的过程就相当于适配器模式。

 

二、UML类图、基本代码

适配器模式---设计模式(12)

基本代码:

class Target
    {
        public virtual void Request()
        {
            Console.WriteLine("commom request");
        }
    }
    class Adaptee
    {
        public void SpecificalRequest()
        {
            Console.WriteLine("specifical Request");
        }
    }
    class Adapter : Target
    {
        private Adaptee adptee = new Adaptee();

        public override void Request()
        {
            adptee.SpecificalRequest();
        }
    }

 测试如下:

Target target = new Adapter();
target.Request();

 

三、举例说明

  国内电压是220v,朋友从国外购买一家用电器的工作电压是110v,这算是一个特殊需求。此时就需要电源适配器供电工作。代码如下:

适配器模式---设计模式(12)适配器模式---设计模式(12)
class Program
    {
        static void Main(string[] args)
        {
            China china = new Adapter();
            china.Request();

            Console.Read();
        }
    }

    //国内供电
    class China
    {
        public virtual void Request()
        {
            Console.WriteLine("the voltage is 220v");
        }
    }

    //用电器供电特殊需求
    class Foreign
    {
        public void SpecificalRequest()
        {
            Console.WriteLine("the voltage is 110v");
        }
    }

    //电源适配器
    class Adapter : China
    {
        private Foreign foreign = new Foreign();

        public override void Request()
        {
            foreign.SpecificalRequest();
        }
    }
View Code

 

四、优缺点及适用场景

优点:

1)可以在不修改原有代码的基础上复用现有的类,很好的遵守“开闭原则”.

缺点:

针对基本代码,重定义Adaptee的行为比较困难,这就需要生成Adaptee的子类并且使得Adapter引用这个子类而不是Adaptee本身。

 

适用场景:

系统需要复用现有类,而该类的接口不符合系统的需求。

 

补充:

在温故适配器模式的时,看到网上有个实例写得不错,对其进行简要改写,记录如下。

德国充电器是两项圆插头充电,此次补充两个单词,charger:充电器。charge:充电。此处编写一通用充电器接口IChargerInterface,德国充电器继承通用充电器。

public interface IChargerInterface
    {
        void Charge();
    }

    public class GermanyCharger : IChargerInterface
    {
        public void Charge()
        {
            Console.WriteLine("德国标准的两项圆头插头");
        }
    }

不添加任何客户端,直接测试:

IChargerInterface charger = new GermanyCharger();
charger.Charge();

 适配器模式---设计模式(12)

在德国,外出需要住旅馆,旅馆中肯定有充电器的客户端:

public class Hotel
    {
        private IChargerInterface charger;

        public Hotel(IChargerInterface charger)
        {
            this.charger = charger;
        }

        public void charge()
        {
            charger.Charge();
        }
    }

加入hotel客户端后,测试其功能:

IChargerInterface charger = new GermanyCharger();
Hotel hotel = new Hotel(charger);
hotel.charge();

适配器模式---设计模式(12)

如今中国的旅行者进入德国进行旅游,带着国内的充电器和适配器转换头。编写中国三项扁平插头充电器继承通用充电器,编写充电器适配器:

public class ChinaCharger : IChargerInterface
    {
        public void Charge()
        {
            Console.WriteLine("中国标准的三项扁平插头");
        }
    }

    public class ChargerAdapter : IChargerInterface
    {
        private IChargerInterface charger = new ChinaCharger();

        public void Charge()
        {
            charger.Charge();
        }
    }

不加hotel客户端进行测试:

IChargerInterface charger = new ChargerAdapter();
charger.Charge();

适配器模式---设计模式(12)

加入hotel客户端进行测试:

IChargerInterface charger = new ChargerAdapter();
Hotel hotel = new Hotel(charger);
hotel.charge();

适配器模式---设计模式(12)

实例完毕。

 

引用:

一个示例让你明白适配器模式