定義處理者介面與鏈結管理:
using System;
using System.Collections.Generic;
using System.Text;
namespace Pattern.ChainOfResponsibility
{
///
/// 抽象處理者(Handler)角色
///
public abstract class AbstractExecutor
{
///
/// 抽象處理者(Handler)角色
///
protected AbstractExecutor _executor;
///
/// 設定責任鏈的上一級物件
///
///
public void SetSuccessor(AbstractExecutor executor)
{
this._executor = executor;
}
///
/// 插入 Message
///
/// Message 實體物件
/// 執行者;內容;時間
public abstract string Insert(MessageModel mm);
}
}
鏈頭處理者,處理長度 < 5 字元的訊息:
using System;
using System.Collections.Generic;
using System.Text;
namespace Pattern.ChainOfResponsibility
{
///
/// 具體處理者(ConcreteHandler)角色
///
public class Employee : AbstractExecutor
{
///
/// 插入 Message
///
/// Message 實體物件
/// 執行者;內容;時間
public override string Insert(MessageModel mm)
{
string rtn = "";
// 插入的信息字符數小於 5
if (mm.Message.Length < 5)
{
SqlMessage m = new SqlMessage();
if (m.Insert(mm))
{
rtn = "執行者:雇員" + " 內容:" + mm.Message + " 時間:" + mm.PublishTime.ToString();
}
}
// 否則讓上級去執行
else if (base._executor != null)
{
rtn = _executor.Insert(mm);
}
return rtn;
}
}
}
_executor 欄位持有下一級處理者。SetSuccessor() 建立責任鏈連結。Insert() 定義處理契約,子類別實作具體條件與邏輯。_executor。| 維度 | 責任鏈 | 裝飾模式 |
|---|---|---|
| 核心意圖 | 請求在鏈中傳遞直到被處理 | 動態添加職責,所有裝飾器都執行 |
| 執行次數 | 通常只有一個處理者執行 | 所有裝飾器依序執行 |
| 鏈結方向 | 單向(傳遞給下一個) | 雙向(委派給內層,返回結果) |
| 終止條件 | 找到處理者或到達鏈尾 | 到達核心 Component |