天天看点

极速理解设计模式系列: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

继续阅读