[Design Pattern] Visitor 模式 (二)
在上一篇介紹了 Visitor 模式,在不常新增衍生類別時,它會是一個好方法。但如果今天要新增一個飛機類別,要在 IVisitor
定義一個新方法及在 Visitor
類別中實作該方法,新增完後會需要將既有的類別重新編譯,很不方便。
Acyclic Visitor Pattern 解決了這個問題,我們可以將 IVisitor
介面退化,讓它不包含任何方法,然後各個類別各自建立自己的介面。
在上一篇介紹了 Visitor 模式,在不常新增衍生類別時,它會是一個好方法。但如果今天要新增一個飛機類別,要在 IVisitor
定義一個新方法及在 Visitor
類別中實作該方法,新增完後會需要將既有的類別重新編譯,很不方便。
Acyclic Visitor Pattern 解決了這個問題,我們可以將 IVisitor
介面退化,讓它不包含任何方法,然後各個類別各自建立自己的介面。
有時會需要對既有的類別新增方法,但該方法又會因為不同的類別有些微的差異,最土炮的方法是在各個類別中實作該方法,但如果下次又有類似的需求,又要再次修改各個類別,這樣無法遵守開放封閉原則。
這時可以使用訪問者模式,在不改變既有類別的情況下,將欲新增的方法收攏至訪問者類別中,【無瑕的程式碼】書中介紹的訪問者種類有以下四種,我會各自發一篇文做介紹:
.NET Core 支援相依性注入 (Depedency Injection) 的設計模式,以往的 .NET Framework 在不支援 DI 的時候,我們會利用一些套件幫助我們完成這件事,例如 Autofac。假設現在我們有多個服務要註冊,使用 Autofac 來做 DI,可以使用以下的方法實現:
1 | public class ServiceDI : Autofac.Module |
Wiki 上是這麼定義 Adapter 模式的:
將一個類別的介面轉接成使用者所期待的。一個適配使得因介面不相容而不能在一起工作的類別能在一起工作。
舉個例子,我有養狗,但是我喜歡的女生比較喜歡貓,為了吸引他的注意力,我決定把我的狗假扮成一隻貓。套用到 Adapter 模式,可以想像成是這樣: 我要把我的狗 (Adaptee),藉由外觀的打扮 (Adapter),變成一隻貓 (Target)
訂閱者模式在生活中處處可見,例如讀者訂閱新聞。而我是這麼理解觀察者模式的;當我在意的「新聞中心」有更新時,它會通知我,我再去看它的更新為何,在參考書中通常會將新聞中心這個角色稱為「主題」,讀者稱為「觀察者」,下面的範例就會以讀者訂閱新聞去做解釋。主要會分為三段:
在寫程式時,我們很常用 DateTime.Now 來取得現在的時間。但這樣會遇到一個問題:若要為該方法寫測試時,會因為使用 DateTime.Now,每次取得的時間都不同,導致測試無法通過。
現在有個方法單純的回傳字串,但因為 timeNow 是不固定的,導致測試無法通過,這邊介紹兩種方法,都可以解決此問題。
1 | public string CreateMessage() |
假設我們今天要開一間玩具工廠,工廠生產的玩具有:金剛、哥吉拉,寫法可能像這樣:
1 | /*Program.cs*/ |
上一篇有提到,Template Method Pattern 違反了 DIP 原則,在寫程式時最需要注意的就是耦合性,倘若程式之間的耦合性高,修改一個類別結果造成所有繼承他的類別都需要修改,這樣的維護成本太高,而 Strategy Pattern 提供了解法。接續上一篇的範例,我們使用 Strategy 模式再重寫一次,會分為以下幾個步驟:
Template Method Pattern,顧名思義它就是一個模板,必須要在它指定的框架內完成實作。
所以要使用 Template Method Pattern,可以分為幾個步驟: