1、概述:
职责链就是上下级各个部门连接成了一条链,当一个请求沿着这个链往上走的时候,当某一个链接点满足该请求的处理要求的时候,就会处理该请求,否则继续往上传,这在日常生活的比较常见,比如,一个员工请假,先是提交给组长,组长再提交给部门主任,部门主任在提交给部门经理等等,一级一级的网上提交。
2、定义:
使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,将这个对象连接成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
3、UML类图:

4、好处:
接收者和发送者都没有对方的明确信息,且链中的对象自己也不知道链的结构,结果是职责链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需要它所有的候选接受者的引用,大大降低了耦合度。
5、示例代码:
下面一个部门请假的为例:
管理者类:
abstract class Manager//抽象管理者类
{
protected Manager superior;//管理者的上一级
public void SetSuperior(Manage superior)
{
this.superior=superior;
}
abstract public void RequestApplication(Request request);//请求满足条件处理,不满足请求往上级传
}
//经理
class CommonManager:Manager
{
public override void RequestApplication(Request request)
{
if(request.Number<=2)
{
///处理请假
}
else
{
if(superior !=null)
superior.RequestApplication(request);//往上级传
}
}
}
//总监类
class Majordomo:Manager
{
public override void RequestApplication(Request request)
{
if(request.Number <= 5)
{
/// 处理请假
}
else
{
if(superior !=null)
superior.RequestApplication(request);
}
}
}
class GeneralManager:Manager//总经理级别,职责链的最后一个连接点,请求传到这里,一定要处理,否则就没法处理了
{
public override void RequestApplication(Request request)
{
if(request.Number>5)
{
///处理请假
}
}
}
客户端:
Manager jinli=new CommonManage();//经理
Majordomo zongjian =new Majordomo();//总监
GeneralManager zongjingli =new GeneralManager();//总经理
jinli.SetSuperior(zongjian);//设置经理上级
zongjian.SetSuperior(zongjingli);
Request request =new Request();
request.Number =4;
jinli.RequestApplication(request);
浙公网安备 33010602011771号