码迷,mamicode.com
首页 > 其他好文 > 详细

五分钟一个设计模式之责任链模式

时间:2015-06-08 11:48:39      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:责任链模式   设计模式   

五分钟一个设计模式,用最简单的方法来描述设计模式。查看更多设计模式,请点击五分钟一个设计模式系列
http://blog.csdn.net/daguanjia11/article/category/3259443

请假流程

假设现在一个公司的请假流程如下:一天及以下由小组组长审批,一天以上三天以下由经理审批,三天以上七天以下由老板审批,七天以上直接劝退。

如果每次请假时都很长的if…else…来判断该去找谁请假,很不容易扩展,我们使用责任链模式来实现。

首先,是一个抽象的父类

public abstract class Handler
{
    private int days = 0;
    private Handler nextHandler;
    public void HandleRequest(float days)
    {
        if (IsInResposibilityScope(days))
        {
            Sign();
        }
        else
        {
            if (nextHandler != null)
            {
                nextHandler.HandleRequest(days);
            }
            else
            {
                Console.WriteLine("请假太久了,请直接提交辞职报告吧!");
            }
        }
    }

    /// <summary>
    /// 设置下一个处理请假请求的人
    /// </summary>
    /// <param name="nextHandler"></param>
    public void SetNext(Handler nextHandler)
    {
        this.nextHandler = nextHandler;
    }

    /// <summary>
    /// 这个请假天数是否在自己的职责范围内
    /// </summary>
    /// <returns></returns>
    protected abstract bool IsInResposibilityScope(float days);

    /// <summary>
    /// 领导签字,表示请假得到了审批
    /// </summary>
    protected abstract void Sign();

}

下面是几个继承自Handler的子类,分别是小组组长类,经理类和老板类

public class GroupLeader : Handler
{
    protected override bool IsInResposibilityScope(float days)
    {
        if (days <= 1)
        {
            return true;
        }
        return false;
    }

    protected override void Sign()
    {
        Console.WriteLine("主管签字同意了");
    }
}
public class Manager : Handler
{
    protected override bool IsInResposibilityScope(float days)
    {
        if (days > 1 && days <= 3)
        {
            return true;
        }
        return false;
    }

    protected override void Sign()
    {
        Console.WriteLine("经理签字同意了");
    }
}
public class Boss:Handler
{
    protected override bool IsInResposibilityScope(float days)
    {
        if (days > 3 && days <= 7)
        {
            return true;
        }
        return false;
    }

    protected override void Sign()
    {
        Console.WriteLine("老板签字同意了");
    }
}

好了,所有的类都有了,下面看如何来请假

class Program
{
    static void Main(string[] args)
    {
        GroupLeader groupLeader = new GroupLeader();
        Manager manager = new Manager();
        Boss boss = new Boss();

        //先设置好请假审批的先后顺序
        groupLeader.SetNext(manager);
        manager.SetNext(boss);

        //下面分别请假1、2、5、10天
        groupLeader.HandleRequest(1);
        groupLeader.HandleRequest(2);
        groupLeader.HandleRequest(5);
        groupLeader.HandleRequest(10);
    }
}

返回结果如下:
主管签字同意了
经理签字同意了
老板签字同意了
请假太久了,请直接提交辞职报告吧!

认识责任链模式

责任链模式的定义:使多个对象都能够处理请求,从而避免请求的发送者和接受者的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

在这个请假流程的处理中,请假者不需要知道他的请求需要提交给谁,只需要提交给责任链的第一个对象就行了,如果第一个对象处理不了的话,会自动交给链上的下一个对象。这就实现了请求的发送者和接收者解耦了。

如果处理请求的逻辑变了,如,小组长可以审批2天以内的请假流程了,或者新增了一个总监职位,可以处理一周内的请假流程等,只需要修改特定的类,或扩展新类,请求的发送者是不需要知道的,发送请求的代码也不需要修改。

五分钟一个设计模式之责任链模式

标签:责任链模式   设计模式   

原文地址:http://blog.csdn.net/daguanjia11/article/details/46407769

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!