[Design Pattern] STATE 模式

我們就以工程師的一天:Eat、Coding、Sleep 三種狀態,來示範 STATE 模式
STATE 模式是由以下三個部分組成:

  1. Context:用來控制所有的狀態,其會是與客戶端的接口,客戶端只會與 Context 互動
  2. State:定義各個狀態的抽象方法,ConcreteState 會繼承 State 並實作其方法
  3. ConcreteState:Eat、Coding、Sleep,三種狀態的實作
Read more

[Design Pattern] Visitor 模式 (三)

Visitor 模式可以再不改變現有類別結構的情況下,像類別結構增加新方法。另一個可以達到相同目的的模式是 Decorator 模式。

想像假設要實作一個方法,乘客要下車時需要按下車鈴通知司機。如果將該方法宣告在介面中,並讓各個類別實作,這樣也不是不行,但是如果之後有更多需求,就會變得需要頻繁異動該類別。

所以可以這樣想:讓有該需求的使用者去呼叫實作該需求的類別即可,即我實作一個「下車按鈴」的類別,讓公車類別來使用,如果交通工具是機車的話就不會使用到該類別。

Read more

[Design Pattern] Visitor 模式 (二)

在上一篇介紹了 Visitor 模式,在不常新增衍生類別時,它會是一個好方法。但如果今天要新增一個飛機類別,要在 IVisitor 定義一個新方法及在 Visitor 類別中實作該方法,新增完後會需要將既有的類別重新編譯,很不方便。

Acyclic Visitor Pattern 解決了這個問題,我們可以將 IVisitor 介面退化,讓它不包含任何方法,然後各個類別各自建立自己的介面。

Read more

[Design Pattern] Visitor 模式 (一)

有時會需要對既有的類別新增方法,但該方法又會因為不同的類別有些微的差異,最土炮的方法是在各個類別中實作該方法,但如果下次又有類似的需求,又要再次修改各個類別,這樣無法遵守開放封閉原則。

這時可以使用訪問者模式,在不改變既有類別的情況下,將欲新增的方法收攏至訪問者類別中,【無瑕的程式碼】書中介紹的訪問者種類有以下四種,我會各自發一篇文做介紹:

  1. Visitor 模式
  2. Acyclic Visitor 模式
  3. Decorator 模式
  4. Extenstion Object 模式
Read more

[Design Pattern] Adapter 模式

Wiki 上是這麼定義 Adapter 模式的:

將一個類別的介面轉接成使用者所期待的。一個適配使得因介面不相容而不能在一起工作的類別能在一起工作。

舉個例子,我有養狗,但是我喜歡的女生比較喜歡貓,為了吸引他的注意力,我決定把我的狗假扮成一隻貓。套用到 Adapter 模式,可以想像成是這樣: 我要把我的狗 (Adaptee),藉由外觀的打扮 (Adapter),變成一隻貓 (Target)

Read more

[Design Pattern] Observer 模式

訂閱者模式在生活中處處可見,例如讀者訂閱新聞。而我是這麼理解觀察者模式的;當我在意的「新聞中心」有更新時,它會通知我,我再去看它的更新為何,在參考書中通常會將新聞中心這個角色稱為「主題」,讀者稱為「觀察者」,下面的範例就會以讀者訂閱新聞去做解釋。主要會分為三段:

  1. 主題
  2. 觀察者
  3. 註冊及發送通知
Read more

[Design Pattern] Factory 模式

假設我們今天要開一間玩具工廠,工廠生產的玩具有:金剛、哥吉拉,寫法可能像這樣:

Program.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/*Program.cs*/

using System;
using DemoCode.DesignPattern.Factory;

namespace DemoCode
{
class Program
{
static void Main(string[] args)
{
IToy toy1 = new Gozilla();
IToy toy2 = new KingKong();

Console.WriteLine($"Toy I made: {toy1.ToyName}");
Console.WriteLine($"Toy I made: {toy2.ToyName}");
}
}
}
Read more

[Design Pattern] Strategy 模式

上一篇有提到,Template Method Pattern 違反了 DIP 原則,在寫程式時最需要注意的就是耦合性,倘若程式之間的耦合性高,修改一個類別結果造成所有繼承他的類別都需要修改,這樣的維護成本太高,而 Strategy Pattern 提供了解法。接續上一篇的範例,我們使用 Strategy 模式再重寫一次,會分為以下幾個步驟:

  1. 定義料理的抽象介面
  2. 實作中式料理類別
  3. 實作料理類別
Read more

[Design Pattern] Template Method 模式

Template Method Pattern,顧名思義它就是一個模板,必須要在它指定的框架內完成實作。

所以要使用 Template Method Pattern,可以分為幾個步驟:

  1. 定義父類別抽象類型,也就是定義框架
  2. 子類別類型繼承父類別
  3. 子類別類型實作父類別的抽象方法
Read more