首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

設計模式實戰:MIME 編碼類別的 Strategy 模式重構與 Template Method 對比

     編輯:關於VC++

背景知識

MIME (Multipurpose Internet Mail Extensions) 將 8-bit 資料轉為 7-bit 傳輸。常見編碼:Base64、Quoted-printable、7bit、8bit、Binary。

  • Base64:每 3 Bytes (24 bits) 切成 4 組 6 bits,查表映射為 64 可列印字符,不足以 '=' 填充
  • Quoted-printable:無需編碼字符直接輸出,需編碼者輸出 '=' + 兩位十六進位值

設計目標

  • 可重用:支援 Email 用戶端、亂碼檢視、XML 內嵌二進位等場景
  • 易用:介面簡潔,支援 CString 與 byte buffer 互轉
  • 易擴充:新增演算法不修改既有程式碼

演進過程

方案 1:Utility 靜態方法類

8 個極度相似的多載函數 (Encode/Decode × CString/byte* × 輸入/輸出組合),介面混亂,難以擴充。

方案 2:Template Method 模式 (失敗)

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++ 建構子呼叫虛函數不具備多態性,會執行基類版本,導致演算法無法切換。

方案 3:Strategy 模式 (成功)

將演算法抽離為獨立策略類別階層,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 vs Strategy 深度對比

面向Template MethodStrategy
核心關鍵字Skeleton (骨架)Algorithm Family (演算法家族)
實現機制繼承委派/組合
模式分類類別模式物件模式
變化粒度演算法特定步驟整個演算法
擴充方式衍生子類別,Override 虛函數實作新 Strategy 類別
客戶端知情度透明,不知具體子類別需明確選擇具體 Strategy
耦合度繼承耦合 (緊)介面耦合 (鬆)
Framework 支援好萊塢原則核心支撐較少用於框架層

關鍵洞見

《設計模式》一書:「Template Method 使用繼承改變演算法的一部分;Strategy 使用委派改變整個演算法。」

本文實戰案例證明:建構子中需執行多態演算法 時,Template Method 因語言機制失效,必須改用 Strategy。這是物件模式相對類別模式優勢的極端範例。

Borland OWL 對話框驗證 Strategy 應用

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

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved