不一樣的介面卡模式(設計模式三)
阿新 • • 發佈:2019-12-23
前言
介面卡模式,是一個看起來簡單的模式,同時也是最複雜的模式。
檢視介面卡的作用,直接檢視它的演化,也許更為容易理解。
開車出發
介面卡大概分為兩類,一類為類介面卡,另一類為物件介面卡。
//新介面 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 圖
畫圖,後續補上。
總結
介面卡模式的場景是為了適配新的需求,新的需求可以複用舊的介面或者類。
作用:保留現有類所提供的服務,向新需求提供介面,以滿足新需求的期