[Design Pattern] STATE 模式
我們就以工程師的一天:Eat、Coding、Sleep 三種狀態,來示範 STATE 模式
STATE 模式是由以下三個部分組成:
- Context:用來控制所有的狀態,其會是與客戶端的接口,客戶端只會與 Context 互動
- State:定義各個狀態的抽象方法,ConcreteState 會繼承 State 並實作其方法
- ConcreteState:Eat、Coding、Sleep,三種狀態的實作
我們就以工程師的一天:Eat、Coding、Sleep 三種狀態,來示範 STATE 模式
STATE 模式是由以下三個部分組成:
Visitor 模式可以再不改變現有類別結構的情況下,像類別結構增加新方法。另一個可以達到相同目的的模式是 Decorator 模式。
想像假設要實作一個方法,乘客要下車時需要按下車鈴通知司機。如果將該方法宣告在介面中,並讓各個類別實作,這樣也不是不行,但是如果之後有更多需求,就會變得需要頻繁異動該類別。
所以可以這樣想:讓有該需求的使用者去呼叫實作該需求的類別即可,即我實作一個「下車按鈴」的類別,讓公車類別來使用,如果交通工具是機車的話就不會使用到該類別。
在上一篇介紹了 Visitor 模式,在不常新增衍生類別時,它會是一個好方法。但如果今天要新增一個飛機類別,要在 IVisitor
定義一個新方法及在 Visitor
類別中實作該方法,新增完後會需要將既有的類別重新編譯,很不方便。
Acyclic Visitor Pattern 解決了這個問題,我們可以將 IVisitor
介面退化,讓它不包含任何方法,然後各個類別各自建立自己的介面。
有時會需要對既有的類別新增方法,但該方法又會因為不同的類別有些微的差異,最土炮的方法是在各個類別中實作該方法,但如果下次又有類似的需求,又要再次修改各個類別,這樣無法遵守開放封閉原則。
這時可以使用訪問者模式,在不改變既有類別的情況下,將欲新增的方法收攏至訪問者類別中,【無瑕的程式碼】書中介紹的訪問者種類有以下四種,我會各自發一篇文做介紹:
Wiki 上是這麼定義 Adapter 模式的:
將一個類別的介面轉接成使用者所期待的。一個適配使得因介面不相容而不能在一起工作的類別能在一起工作。
舉個例子,我有養狗,但是我喜歡的女生比較喜歡貓,為了吸引他的注意力,我決定把我的狗假扮成一隻貓。套用到 Adapter 模式,可以想像成是這樣: 我要把我的狗 (Adaptee),藉由外觀的打扮 (Adapter),變成一隻貓 (Target)
訂閱者模式在生活中處處可見,例如讀者訂閱新聞。而我是這麼理解觀察者模式的;當我在意的「新聞中心」有更新時,它會通知我,我再去看它的更新為何,在參考書中通常會將新聞中心這個角色稱為「主題」,讀者稱為「觀察者」,下面的範例就會以讀者訂閱新聞去做解釋。主要會分為三段:
假設我們今天要開一間玩具工廠,工廠生產的玩具有:金剛、哥吉拉,寫法可能像這樣:
1 | /*Program.cs*/ |
上一篇有提到,Template Method Pattern 違反了 DIP 原則,在寫程式時最需要注意的就是耦合性,倘若程式之間的耦合性高,修改一個類別結果造成所有繼承他的類別都需要修改,這樣的維護成本太高,而 Strategy Pattern 提供了解法。接續上一篇的範例,我們使用 Strategy 模式再重寫一次,會分為以下幾個步驟:
Template Method Pattern,顧名思義它就是一個模板,必須要在它指定的框架內完成實作。
所以要使用 Template Method Pattern,可以分為幾個步驟: