五分钟一个设计模式,用最简单的方法来描述设计模式。查看更多设计模式,请点击五分钟一个设计模式系列
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