MIME (Multipurpose Internet Mail Extensions) 將 8-bit 資料轉為 7-bit 傳輸。常見編碼:Base64、Quoted-printable、7bit、8bit、Binary。
8 個極度相似的多載函數 (Encode/Decode × CString/byte* × 輸入/輸出組合),介面混亂,難以擴充。
class CMimeString {
enum PROCESSTYPE { ENCODING, DECODING };
CMimeString(PROCESSTYPE, CString&); // 建構子執行編碼
virtual void Encode(byte*, int);
virtual void Decode(byte*, int);
};
class CBase64String : public CMimeString {
virtual void Encode(byte*, int) override;
virtual void Decode(byte*, int) override;
};
致命缺陷:C++ 建構子呼叫虛函數不具備多態性,會執行基類版本,導致演算法無法切換。
將演算法抽離為獨立策略類別階層,Context 類別持有策略物件參考。
// Context
class CMimeString {
public:
enum PROCESSTYPE { ENCODING, DECODING };
enum ENCODETYPE { WYMIME, BASE64 };
CMimeString(PROCESSTYPE, ENCODETYPE, CString&);
CMimeString(PROCESSTYPE, ENCODETYPE, byte*, int);
operator LPCTSTR() const; // 隱含轉換方便輸出
byte* GetBuf(); int GetBufLen();
};
// Strategy 介面
class CMimeAlgo {
public:
virtual void Encode(byte**, int&, byte*, int);
virtual void Decode(byte**, int&, byte*, int);
};
// Concrete Strategy
class CBase64Algo : public CMimeAlgo {
virtual void Encode(...) override;
virtual void Decode(...) override;
};
使用方式:
CString buf("test data");
CMimeString base64(CMimeString::ENCODING, CMimeString::BASE64, buf);
MessageBox(base64); // 隱含轉換輸出
Template Method 結構
Strategy 結構
| 面向 | Template Method | Strategy |
|---|---|---|
| 核心關鍵字 | Skeleton (骨架) | Algorithm Family (演算法家族) |
| 實現機制 | 繼承 | 委派/組合 |
| 模式分類 | 類別模式 | 物件模式 |
| 變化粒度 | 演算法特定步驟 | 整個演算法 |
| 擴充方式 | 衍生子類別,Override 虛函數 | 實作新 Strategy 類別 |
| 客戶端知情度 | 透明,不知具體子類別 | 需明確選擇具體 Strategy |
| 耦合度 | 繼承耦合 (緊) | 介面耦合 (鬆) |
| Framework 支援 | 好萊塢原則核心支撐 | 較少用於框架層 |
《設計模式》一書:「Template Method 使用繼承改變演算法的一部分;Strategy 使用委派改變整個演算法。」
本文實戰案例證明:建構子中需執行多態演算法 時,Template Method 因語言機制失效,必須改用 Strategy。這是物件模式相對類別模式優勢的極端範例。

OWL 使用 Strategy 模式實現對話框輸入驗證,驗證邏輯可換裝。