天天看點

極速了解設計模式系列:12.責任鍊模式(Chain of Responsibility Pattern)

四個角色:傳遞者接口(Handler)、具體傳遞者(ConcreteHandler)、用戶端(Client) 

        傳遞者接口(Handler):定義一個處理請求的接口和實作下一個對象

        具體傳遞者(ConcreteHandler):如果能夠處理就處理,否則讓上級處理請求

        用戶端(Client) :創立責任鍊,并向鍊中對象提出請求

 實作思路:傳遞者接口設定上級然後提供一個處理請求的方法,在具體傳遞中如果能夠處理就處理,否則就讓其上級來處理,用戶端組織其責任鍊,并且設定請求。

 類圖:

<a target="_blank" href="http://blog.51cto.com/attachment/201204/162756556.gif"></a>

應用場景:OA系統中的請假審批系統,普通開發者想請假,如果請1天及以下的假則隻需要開發經理許可,如果1天&lt;請假天數&lt;=5天則需要總監許可,如果5天&lt;請假天數&lt;=10天則需要副總裁準許,如果請假天數&gt;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 &lt;= 1) 

            Console.WriteLine(Name + " 準許 " + apply.ApplyName + " 申請了 " + apply.ApplyDay + "天假期"); 

        else 

            higher.ExeApply(apply); 

class DirectorHigher : Higher 

    public DirectorHigher(string name) : base(name) { } 

        if (apply.ApplyDay &lt;= 5) 

class VPHigher : Higher 

    public VPHigher(string name) : base(name) { } 

        if (apply.ApplyDay &lt;= 10) 

class CEOHigher : Higher 

    public CEOHigher(string name) : base(name) { } 

        if (apply.ApplyDay&gt;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

繼續閱讀