通俗易懂設計模式解析——適配器模式


前言

  前面完成了創建型的設計模式的分享,創建型的設計模式解決的是對象創建的問題。今天開始介紹結構型的設計模式,其中結構型設計模式包括:適配器模式、橋接模式、裝飾模式、組合模式、外觀模式、享元模式、代理模式。結構型設計模式解決的是類與對象的組合關系。今天講結構型對象中的第一個——適配器模式。適配器模式——顧名思義嘛。在我們平常的理解中,適配器是干啥用的呢?不就是將兩個原本不匹配的東西轉換為匹配罷了。適配器是接口轉換器,比如電源適配器,USB接口轉換器等等。

適配器模式介紹

一、來由

  在系統程序中,我們可能會面臨需求的增加或者改變,或者是應用環境的改變。常常需要將一些已經存在的類放在新的需求或者新的環境中應用。但是新的環境要求使用到的接口與現在存在的類或對象不完全匹配。那么如何去面對這樣的遷移變化呢?

二、意圖

    將一個類的接口轉換成客戶希望的另一個接口。Adapter模式使得原本由於接口不兼容而不能一起工作的那些類可以一起工作。   

三、案例圖

 

四、適配器模式代碼示例

  在適配器模式中一般包含以下部分的存在:

客戶端:與目標接口配合協同使用

目標接口:與客戶端協同使用

被適配角色:表示一個已經存在了並使用的接口

適配器:整個模式核心存在,將被適配角色轉換為目標需要的接口。

  接下來我們看下這個示例,前段時間筆記本那個耳機圓孔接口壞掉了。這個時候我只有手機那種圓孔耳機。但是我也需要在電腦上面使用,那怎么辦呢?我不想多花錢去買一個usb耳機,也沒有時間去把電腦修好。簡單、我去網上買一個耳機的Usb轉換器。然后就可以在電腦上使用了。在這事例中,目標接口是電腦USB耳機,被適配角色是手機圓孔耳機,適配器就是圓孔耳機轉換為USB的過程、電腦則是客戶端:

 

namespace Adapter_Pattern
{
    class AdapterPattern
    {
    }
    #region 目標角色——需要電腦usb耳機=========================
    /// <summary>
    /// 客戶端需要的接口
    /// </summary>
    interface ComputerHeadsetTarget
    {
         void GetComputerHeadset();
    }
    #endregion

    #region 被適配角色——現在存在的手機耳機=====================
    /// <summary>
    /// 目前已經存在的接口
    /// </summary>
    public class Adaptee
    {
        public void PhoneHeadset() 
        {
            Console.WriteLine("我現在擁有的是手機耳機。");
        }
    }
    #endregion

    #region 對象適配器——將手機耳機轉換成電腦需要的usb耳機==========
    /// <summary>
    /// 對象適配器實現
    /// </summary>
    public class ObjectAdapter : ComputerHeadsetTarget
    {
        Adaptee Adaptee = new Adaptee();
        public void GetComputerHeadset()
        {
            Adaptee.PhoneHeadset();
            Console.WriteLine("現在加入耳機Usb轉換器");
            Console.WriteLine("輸出:電腦使用的usb耳機");
        }
    }
    #endregion

    #region 類適配器——將手機耳機轉換成電腦需要的usb耳機===========
    /// <summary>
    /// 類適配器的實現
    /// </summary>
    public class ClassAdapter : Adaptee,ComputerHeadsetTarget
    {
        public void GetComputerHeadset()
        {
            this.PhoneHeadset();
            Console.WriteLine("現在加入耳機Usb轉換器");
            Console.WriteLine("輸出:電腦使用的usb耳機");
        }
    }
    #endregion
}

 

  class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("我現在需要電腦usb耳機");
            ///對象適配器
            ObjectAdapter objectAdapter = new ObjectAdapter();
            objectAdapter.GetComputerHeadset();

            Console.WriteLine("我現在需要電腦usb耳機");
            ///類適配器
            ClassAdapter classAdapter = new ClassAdapter();
            classAdapter.GetComputerHeadset();
            

            Console.ReadLine(); 
        }
    }

 

使用場景及優缺點

  這適配器模式主要用於一些希望被復用的類,但是這些類中的接口又與新的環境不完全匹配的情況下。老代碼遺留修改中、類庫遷移中用處較多。

  在上面示例中寫了適配器的兩種實現方式,對象適配器和類適配器。對於類適配器來說既繼承了目標接口類又繼承了已存在接口類。在C#編程中盡量采用多組合少繼承的形式進行代碼編寫。多繼承提高了類之間的耦合性。所以對於類適配器一般情況盡量少使用。而對於對象適配器來說采用的是對象組合的方式。

一、使用場景

1、系統需要復用現在的類,但是類中接口與現在環境不完全匹配

2、想要建立一個可以復用的類,用於彼此之間沒有太大關聯的一些類。

二、優點

對象適配器:

1、可以再不修改原來的類的基礎上復用原來的類,符合開閉原則

2、采用的”對象組合”,降低類之間的耦合性

類適配器:

1、可以再不修改原來的類的基礎上復用原來的類,符合開閉原則

2、可以重新定義被適配角色類中一部分行為,在類適配器中被適配角色類為基類

3、僅是引用一個對象,不需要額外的字段引用實例

三、缺點

對象適配器:

1、重新定義被適配角色類中部分行為困難

類適配器:

1、對於被適配角色類的子類中的一些方法就不能進行轉換了,因為沒有引用其實例,僅繼承基類。所以只能調用基類中的方法。

2、采用了多繼承的方式。提高了類之間的耦合性

總結

  大家會不會覺得Adapter這個單詞這么熟悉呢?我剛看的時候也覺得蠻熟悉的樣子。應該大多數人都寫過DBHelper這個數據庫輔助類吧,在數據庫連接操作過程中存在着DataSet對象和DataAdaper對象。DataAdaper也就是數據適配器,負責把DataSet與真實數據源連接起來。DataAdaper獲得數據,然后將數據填充到DataSet對象中。針對於數據庫與DataSet之間的一種適配。這也是.NET中一種適配器模式的實現。

 天再高又怎樣,踮起腳尖就更接近陽光。

 

    C#設計模式系列目錄

歡迎大家掃描下方二維碼,和我一起踏上設計模式的闖關之路吧!

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM