展示裝飾模式的核心優勢:動態組合多個裝飾器,靈活擴展物件功能:
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,結果同時包含兩個驗證標記。| 維度 | 繼承 | 裝飾模式 |
|---|---|---|
| 擴展方式 | 靜態(編譯期) | 動態(運行時) |
| 組合靈活性 | 單一繼承,組合困難 | 任意組合,支援多層疊加 |
| 類別數量 | 指數增長(排列組合) | 線性增長(每個裝飾器一個類別) |
| 符合原則 | 違反開放封閉原則 | 符合開放封閉原則 |