設計模式(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();

實例完畢。

 

引用:

一個示例讓你明白適配器模式

相關文章
相關標籤/搜索