1. 程式人生 > >不一樣的介面卡模式(設計模式三)

不一樣的介面卡模式(設計模式三)

前言

介面卡模式,是一個看起來簡單的模式,同時也是最複雜的模式。
檢視介面卡的作用,直接檢視它的演化,也許更為容易理解。

開車出發

介面卡大概分為兩類,一類為類介面卡,另一類為物件介面卡。

//新介面
public interface ITarget {
    void Process();
}
//舊介面
public interface Iadapter
{
    void doSomeThing();
    void doOtherThing();
}
//舊介面的實現類
public class oldClass : Iadapter
{
    public void doOtherThing()
    {
        throw new NotImplementedException();
    }

    public void doSomeThing()
    {
        throw new NotImplementedException();
    }
}
//新的介面實現
public class Adapter : oldClass, ITarget
{
    public void Process()
    {
        doSomeThing();
        doOtherThing();
    }
}

解釋:

作用
ITarget 一個新的需求介面
Iadapter 舊的介面
oldClass 舊的介面實現類
Adapter 新的的介面實現類

從上面可以看出,新的介面的需求裡,需要呼叫舊的接口裡面的實現方法。這是它的一個應用場景。
很容易想到一個問題,為什麼不直接擴充套件舊的介面呢?其實更加真實的場景,請看下面這張圖。

在這裡,通過這種方式,我們可以說是適配了一個多型場景。
這種方式視為類介面卡,存在的很大的侷限性,請看下圖紅色部分。

在紅色的部分中,圈出了oldclass,這意味著我們僅僅對oldclass進行了適配。如果Iadapter還有其他衍生的類,那麼這將是一個龐大的結構問題,不建議使用。

物件介面卡:

//新介面
public interface ITarget {
    void Process();
}
//舊介面
public interface Iadapter
{
    void doSomeThing();
    void doOtherThing();
}
//舊介面的實現類
public class oldClass : Iadapter
{
    public void doOtherThing()
    {
        throw new NotImplementedException();
    }

    public void doSomeThing()
    {
        throw new NotImplementedException();
    }
}
//新的介面實現
public class Adapter :  ITarget
{
    public Iadapter Iadapter;

    public Adapter(Iadapter Iadapter) {
        this.Iadapter = Iadapter;
    }
    public void Process()
    {
        Iadapter.doSomeThing();
        Iadapter.doOtherThing();
    }
}

請看下圖:

這樣我們就適配了Iadapter 這個介面下的所有實現類,比類介面卡的另一個好處是,在不能多繼承的高階語言(鑽石繼承)中,可以如下實現,也更符合實際的複雜一點點的情形。

對於複雜一點的物件介面卡依然實用,但是類介面卡卻很難做到。
呼叫:

static void Main(string[] args)
{
    Iadapter adapter = new oldClass();
    ITarget target = new Adapter(adapter);
    target.Process();
}

uml 圖

畫圖,後續補上。

總結

介面卡模式的場景是為了適配新的需求,新的需求可以複用舊的介面或者類。
作用:保留現有類所提供的服務,向新需求提供介面,以滿足新需求的期