天天看點

極速了解設計模式系列:6.擴充卡模式(Adapter Pattern)

四個角色:目标抽象類角色(Target)、目标對象角色(Adapter)、源對象角色(Adaptee)、用戶端角色(Client)

        目标抽象類角色(Target):定義需要實作的目标接口

        目标對象角色(Adapter):調用另外一個源對象,并且轉換(适配)為需要的目标對象。

        源對象角色(Adaptee):因為提供的功能不能滿足現狀,需要轉換的源對象。

        用戶端角色(Client):調用目标對象,對源對象進行加工。

         實作思路:首先取得需要轉換的源對象,然後通過Adapter對源對象進行加工得到目标對象。

 類圖:

<a target="_blank" href="http://blog.51cto.com/attachment/201204/160758430.jpg"></a>

        應用場景:在第三方類庫中有一個源對象可以實作判斷使用者是否屬于成人、是幾個字的名字,但是需要的功能是顯示使用者資訊,且不能更改第三方類庫。

        分析:現在的系統中需要的是顯示使用者資訊的功能,在這裡我們通過擴充卡模式調用第三方的對象,在目标對象中顯示使用者資訊處理,并提供接口給用戶端。

        下面我們在控制台程式去示範一下如何使用Adapter Pattern:

        一、目标抽象類角色(Target)

//Target(目标抽象類角色) 

interface ITarget 

    void ShowInfo(); 

        二、目标對象角色(Adapter)

//Adapter(目标對象角色) 

public class TargetInfoAdapter:ITarget 

    SourceInfo sinfo; 

    public TargetInfoAdapter(SourceInfo sourceinfo) 

    { 

        this.sinfo = sourceinfo; 

    } 

    public void ShowInfo() 

        Console.WriteLine(sinfo.Name + ":" + sinfo.Age + "歲   " + sinfo.IsAdult() + "   " + sinfo.NumberOfName()); 

        三、源對象角色(Adaptee)

//Adaptee(源對象角色) 

public class SourceInfo 

    public string Name { get; set; } 

    public int Age { get; set; } 

    public string IsAdult() 

        return Age &gt; 17 ? "成年" : "未成年"; 

    public string NumberOfName() 

        return Name.Length.ToString() + "個字名!"; 

        四、用戶端角色(Client)

//Client(用戶端角色) 

class Program 

    static void Main(string[] args) 

        //取得源對象 

        SourceInfo sinfo = new SourceInfo() { Name="小明",Age=15 }; 

        //通過擴充卡轉化源對象為目标對象。 

        ITarget target =new TargetInfoAdapter(sinfo); 

        target.ShowInfo(); 

        Console.ReadLine(); 

本文轉自程興亮 51CTO部落格,原文連結:http://blog.51cto.com/chengxingliang/826968

繼續閱讀