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

C# 設計模式:裝飾模式完整測試與多層裝飾驗證 (6/6)

     編輯:關於C語言

客戶端測試程式碼

展示裝飾模式的核心優勢:動態組合多個裝飾器,靈活擴展物件功能:

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

using Pattern.Decorator;

public partial class Decorator : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        AbstractMessage message = new SqlMessage();

        // 單層裝飾:用戶驗證
        AbstractMessageWrapper amr = new CheckUserWrapper(message);
        Response.Write(amr.Get()[0].Message + " " + amr.Get()[0].PublishTime.ToString());
        Response.Write("<br />");

        // 單層裝飾:輸入驗證
        AbstractMessageWrapper amr2 = new CheckInputWrapper(message);
        Response.Write(amr2.Get()[0].Message + " " + amr2.Get()[0].PublishTime.ToString());
        Response.Write("<br />");

        // 多層裝飾:先用戶驗證,再輸入驗證
        AbstractMessageWrapper amr3 = new CheckUserWrapper(message);
        AbstractMessageWrapper amr4 = new CheckInputWrapper(amr3);
        Response.Write(amr4.Get()[0].Message + " " + amr4.Get()[0].PublishTime.ToString());
        Response.Write("<br />");
    }
}

執行結果

SQL方式獲取Message(經過用戶驗證) 2007-5-13 19:34:01
SQL方式獲取Message(經過輸入驗證) 2007-5-13 19:34:01
SQL方式獲取Message(經過用戶驗證)(經過輸入驗證) 2007-5-13 19:34:01

結果分析

  • 單一裝飾:CheckUserWrapper、CheckInputWrapper 各自獨立擴展功能。
  • 疊加裝飾:amr4 先包裝 CheckUserWrapper,再包裝 CheckInputWrapper,結果同時包含兩個驗證標記。
  • 順序敏感:裝飾順序影響執行順序(外層裝飾器先執行或後執行取決於具體實作)。
  • 無需子類別爆炸:若用繼承需建立 SqlMessage_CheckUser、SqlMessage_CheckInput、SqlMessage_CheckUser_CheckInput... 等組合類別。

裝飾模式 vs 繼承對比

維度繼承裝飾模式
擴展方式靜態(編譯期)動態(運行時)
組合靈活性單一繼承,組合困難任意組合,支援多層疊加
類別數量指數增長(排列組合)線性增長(每個裝飾器一個類別)
符合原則違反開放封閉原則符合開放封閉原則

參考資源

DoFactory 裝飾模式

裝飾模式類別圖
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved