1. 程式人生 > >面向對象編程思想-適配器模式

面向對象編程思想-適配器模式

好的 優點 雷電 abstract 開閉 write 重新定義 style 部分

一、引言

富蘭克林揭秘了雷電的真實面目,那我們是否設想過將雷電儲存下來呢?生活中如果買了國外的電器(美國、日本)使用電壓為110V的,可國內通常電壓是220V的,國外電器使用電壓與國內電壓不符,那怎麽才能讓它適用國內這個環境而正常使用呢?我們知道這時候需要用到電源適配器220V-110V,電器才能正常使用。電源適配器實現能使用220V電壓方法,但實質調用的是使電器能使用110V電壓這一行為。類比在程序設計中,也存在這樣的思想,沒錯就是我們今天要學習的結構型設計模式之適配器模式

二、適配器模式

定義:將一個類的接口轉換成客戶希望的另外一個接口,使得原本由於接口不兼容而無法一起工作的類可以一起工作。

適配器模式有類適配器模式和對象適配器模式,下面是類的適配器模式代碼demo

  //客戶所期待的接口,目標可以是具體或者抽象的類,也可以是接口(充當現有三孔插頭電器)
    public interface IThreeHole
    {
        void Request();
    }

  //兩口插頭 源角色- 需要適配的類(可以理解為現有一個兩孔插座)
    public abstract class TwoHole
    {
        public void SpecificRequest()
        {
            Console.WriteLine("我是兩孔插頭");
        }
    }

    //電源適配器 (類適配器)
    //適配器提供三孔插頭的行為  實質調用兩孔插頭的方法
    public class PowerAdapter : TwoHole, IThreeHole
    {
        public void Request()
        {
            this.SpecificRequest();
        }
    }

     static void Main(string[] args)
        {
            //(類的適配器)通過電源適配器 使用兩孔插頭
IThreeHole hole = new PowerAdapter(); hole.Request(); Console.Read(); }

下面是對象的適配器代碼demo

   //三孔插頭  目標角色
    public class ThreeHole
    {
        public virtual void Request()
        {

        }
    }

   //兩孔插頭 源角色
    public class TwoHole1
    {
        public void SpecificRequest()
        {
            Console.WriteLine("我是兩孔插頭");
        }
    }

  //(對象的適配器類)適配器類 沒有繼承TwoHole1類
    //通過在內部包裝一個Twohole1對象,使得源接口轉換成目標接口
    public class PowerAdapter1 : IThreeHole
    {
        //引用兩孔插頭對象 使得客戶端可以通過適配器使用兩孔插頭的行為
        private TwoHole1 hole = new TwoHole1();
        public void Request()
        {
            hole.SpecificRequest();
        }
    }

     static void Main(string[] args)
        {//(對象的適配器)
            IThreeHole hole1 = new PowerAdapter1();
            hole1.Request();
            Console.Read();
        }

類適配器優點

1.在不修改原有代碼的基礎上復用現有類,很好的復合了“開閉原則”

2.可以重新定義被適配器類的部分行為,因為適配器類是被適配器類的子類

缺點:當適配器類匹配被適配器類及它的所有子類時,因為C#中類不能被多繼承,所以用類的適配器模式是實現不了的。兩個類耦合度較高。

對象適配器優點

1.相比類適配器模式的優點,對象適配器采用“對象組合”的方式,更加的“松耦合”lll

缺點:重定義被適配器類的行為較困難,這時就需要生成被適配器的子類,並引入被適配器的子類而不是被適配器類

使用場景:復用一些現有的類,但是接口又與現有環境不一致的情況,如.NET類庫提供的適配器DataAdapter。

本文關於設計模式之適配器模式的學習就到這裏了,結構型設計模式更加關註類或者對象組合成的結構及依賴關系。

文中如有不足,歡迎斧正,感謝您的閱讀。

面向對象編程思想-適配器模式