核心委派機制實作,持有被裝飾物件參考並透傳所有操作:
using System;
using System.Collections.Generic;
using System.Text;
namespace Pattern.Decorator
{
///
/// 裝飾 AbstractMessage(Decorator)
///
public abstract class AbstractMessageWrapper : AbstractMessage
{
private AbstractMessage _abstractMessage;
///
/// 建構函式
///
/// AbstractMessage
public AbstractMessageWrapper(AbstractMessage abstractMessage)
{
this._abstractMessage = abstractMessage;
}
///
/// 獲取 Message:委派給被裝飾物件
///
/// MessageModel 清單
public override List<MessageModel> Get()
{
return _abstractMessage.Get();
}
///
/// 插入 Message:委派給被裝飾物件
///
/// Message 實體物件
/// 是否成功
public override bool Insert(MessageModel mm)
{
return _abstractMessage.Insert(mm);
}
}
}
擴展用戶驗證功能:
using System;
using System.Collections.Generic;
using System.Text;
namespace Pattern.Decorator
{
///
/// 擴展出用戶驗證的功能(ConcreteDecorator)
///
public class CheckUserWrapper : AbstractMessageWrapper
{
///
/// 建構函式
///
/// AbstractMessage
public CheckUserWrapper(AbstractMessage abstractMessage)
: base(abstractMessage)
{
}
///
/// 獲取 Message:在基礎結果上附加用戶驗證標記
///
/// MessageModel 清單
public override List<MessageModel> Get()
{
List<MessageModel> l = base.Get();
foreach (MessageModel mm in l)
{
mm.Message += "(經過用戶驗證)";
}
return l;
}
///
/// 插入 Message:可在這裡擴展用戶驗證邏輯
///
/// Message 實體物件
/// 是否成功
public override bool Insert(MessageModel mm)
{
// 在這裡擴展功能
return base.Insert(mm);
}
}
}
AbstractMessage,確保裝飾器與被裝飾物件擁有相同介面。_abstractMessage,具體裝飾器只需覆寫需擴展的方法。AbstractMessage,支援 Component、Decorator 任意層級包裝。AbstractMessage 介面。| 裝飾器 | 擴展功能 | Get() 修改內容 |
|---|---|---|
| CheckUserWrapper | 用戶身份驗證 | 附加 "(經過用戶驗證)" |
| CheckInputWrapper | 輸入資料驗證 | 附加 "(經過輸入驗證)" |
這種設計讓每個驗證邏輯獨立封裝在單一類別中,運行時可靈活組合,避免了在核心 SqlMessage 中混雜大量橫切關注點代碼。