2013年11月21日 星期四

C# Design Pattern - Adapter

在軟體系統中,需要將一些現存的物件放在新的環境中應用,但是新環境要求的介面是這些現存物件所不滿足的,就如同介面轉換器。將一個類別的介面轉換成客戶希望的另外一個介面,這就是本文的Adapter 模組重點。Adapter模式讓原本介面不相容而不能一起運作的那些類別可以一起運作。讓我們看以下實例

用一個介面存放方法:
interface IStack
{
    void Push(object item);
    void Pop();
    object Peek();

}

物件介面轉換器(Adapter與Adaptee組合的關係) ,IStack,是轉換的對象,adaptee轉換的對象:
public class AdapterIStack
{
    ArrayList adaptee;

    public Adapter()
    {
        adaptee = new ArrayList();
    }

    public void Push(object item)
    {
        adaptee.Add(item);
    }

    public void Pop()
    {
        adaptee.RemoveAt(adaptee.Count - 1);
    }

    public object Peek()
    {
        return adaptee[adaptee.Count - 1];
    }

}

介面轉換器的結構呈現:
public class AdapterArrayListIStack
{
    public void Push(object item)
    {
        this.Add(item);
    }

    public void Pop()
    {
        this.RemoveAt(this.Count - 1);
    }

    public object Peek()
    {
        return this[this.Count - 1];
    }

}


Adapter模式的幾個要點:
1.Adapter模式主要應用於希望複用一些現存的類別,但是介面又與複用環境要求不一致的情況。
2.GOF23定義了兩種Adapter模式的實現結構:對象轉換器和類轉換器。物件轉換器採用物件組合的方式,但類轉換器採用多繼承的實現方式。
3.Adapter模式可以實現的非常靈活,不必拘泥於GOF23中定義的兩種結構。

.NET Framewokr中的Adapter應用:
(1)在.Net中複用com對象:
 com 物件不符合.net物件的介面
使用tlbimp.exe來創建一個Runtime Callable Wrapper(RCW)以使其符合.net物件的介面。
(2).NET資料訪問類(Adapter變體):
各種資料庫並沒有提供DataSet介面
使用DBDataAdapter可以將任何各資料庫訪問/存取適配到一個DataSet物件上。
(3)集合類別中對現有物件的排序(Adapter變體);
現有物件未實現IComparable介面

實現一個排序轉換器(繼承IComparer介面),然後在其Compare方法中對兩個物件進行比較。

-雲遊山水為知已逍遙一生而忘齡- 電腦神手

沒有留言:

張貼留言