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

1、定义ide

适配器模式:将一个类的接口转换成客户但愿的另一个接口。Adapter模式使得本来因为接口不兼容而不能一块儿工做的那些类能够一块儿工做。测试

解释:适配器模式比如一个电源适配器,生活中房间内的电压是220v,可是你的不少用电器就不是220v,好比电脑、手机等等,这是须要电源适配器来调节电压,使用电源适配器充电的过程就至关于适配器模式。this

 

2、UML类图、基本代码spa

基本代码:.net

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();
        }
    }

 测试以下:3d

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

 

3、举例说明code

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

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

 

4、优缺点及适用场景继承

优势:接口

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();

 

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

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();

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

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();

加入hotel客户端进行测试:

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

实例完毕。

 

引用:

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

相关文章
相关标签/搜索