四個角色:傳遞者接口(Handler)、具體傳遞者(ConcreteHandler)、用戶端(Client)
傳遞者接口(Handler):定義一個處理請求的接口和實作下一個對象
具體傳遞者(ConcreteHandler):如果能夠處理就處理,否則讓上級處理請求
用戶端(Client) :創立責任鍊,并向鍊中對象提出請求
實作思路:傳遞者接口設定上級然後提供一個處理請求的方法,在具體傳遞中如果能夠處理就處理,否則就讓其上級來處理,用戶端組織其責任鍊,并且設定請求。
類圖:
<a target="_blank" href="http://blog.51cto.com/attachment/201204/162756556.gif"></a>
應用場景:OA系統中的請假審批系統,普通開發者想請假,如果請1天及以下的假則隻需要開發經理許可,如果1天<請假天數<=5天則需要總監許可,如果5天<請假天數<=10天則需要副總裁準許,如果請假天數>10天則需要總裁許可。
分析:在用戶端設定責任鍊和請假審批的上級下級,然後每次普通開發者将請假申請送出到開發經理,如果在開發經理許可範圍之内,則處理,否則送出給他的上級總監,以此類推處理這個請假請求。
下面我們在控制台程式去示範一下如何使用Chain of Responsibility Pattern:
一、 傳遞者接口(Handler)
//傳遞者接口(Handler)
abstract class Higher
{
public string Name { get; set; }
public Higher higher;
public void SetHigher(Higher _Higher)
{
this.higher = _Higher;
}
public Higher(string name)
Name = name;
public abstract void ExeApply(Apply apply);
}
二、具體傳遞者(ConcreteHandler)
//具體傳遞者(ConcreteHandler)
class ManagerHigher : Higher
public ManagerHigher(string name) : base(name) { }
public override void ExeApply(Apply apply)
if (apply.ApplyDay <= 1)
Console.WriteLine(Name + " 準許 " + apply.ApplyName + " 申請了 " + apply.ApplyDay + "天假期");
else
higher.ExeApply(apply);
class DirectorHigher : Higher
public DirectorHigher(string name) : base(name) { }
if (apply.ApplyDay <= 5)
class VPHigher : Higher
public VPHigher(string name) : base(name) { }
if (apply.ApplyDay <= 10)
class CEOHigher : Higher
public CEOHigher(string name) : base(name) { }
if (apply.ApplyDay>10)
三、用戶端(Client)
class Program
static void Main(string[] args)
//責任鍊模式的建立
Higher managerHigher = new ManagerHigher("張三經理");
Higher directorHigher = new DirectorHigher("李四總監");
Higher vpHigher = new VPHigher("王五副總裁");
Higher ceoHigher = new CEOHigher("林一總裁");
managerHigher.SetHigher(directorHigher);
directorHigher.SetHigher(vpHigher);
vpHigher.SetHigher(ceoHigher);
//建立申請人
Apply liuying = new Apply() { ApplyName = "劉穎", ApplyDay = 5 };
Apply chenming = new Apply() { ApplyName = "陳明", ApplyDay = 1 };
Apply zengli = new Apply() { ApplyName = "曾利", ApplyDay = 15 };
//申請人都将申請送出給經理
managerHigher.ExeApply(liuying);
managerHigher.ExeApply(chenming);
managerHigher.ExeApply(zengli);
Console.ReadLine();
申請人
//申請人
class Apply
public string ApplyName { get; set; }
public double ApplyDay { get; set; }
本文轉自程興亮 51CTO部落格,原文連結:http://blog.51cto.com/chengxingliang/827004