责任链模式
2018-04-09 本文已影响48人
YoungerDev
责任链模式
定义: 使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系. 将这些对象连成一条链,并沿着这条链传递该请求,只到有对象处理它为止.
使用场景:
- 多个对象可以处理统一请求,但具体由哪个对象处理则运行时动态决定.
- 在请求处理者不明确的情况下向多个对象中的一个提交一个请求.
- 需要动态指定一组对象处理请求.
举个工作中的例子:
你需要报销,你找你的组长,要报销,发现额度比较高,自己没有权利批复,他就找部门经理,经理发现同样的困境,找总经理报账.
//抽象领导者
public abstract class Leader {
public Leader nextHandler;// 上一级领导处理者
//处理报账请求 ,
public final void handleRequest(int money){
if (money <= limit()){
handle(money);
}else {
if (null!=nextHandler){
nextHandler.handleRequest(money);
}
}
}
//自身能批复的额度权限
protected abstract int limit();
//处理报账行为
protected abstract void handle(int money);
}
public class GroupLeader extends Leader{
@Override
protected int limit() {
return 1000;
}
@Override
protected void handle(int money) {
System.out.println("组长批复报销 :"+money+"元");
}
}
public class Director extends Leader{
@Override
protected int limit() {
return 5000;
}
@Override
protected void handle(int money) {
System.out.println("主管批复报销了 :" +money+"元");
}
}
public class Manager extends Leader{
@Override
protected int limit() {
return 10000;
}
@Override
protected void handle(int money) {
System.out.println("经理批复宝箱:"+money+"元");
}
}
public class Boss extends Leader{
@Override
protected int limit() {
return Integer.MAX_VALUE;
}
@Override
protected void handle(int money) {
System.out.println("老板批复报销 :"+money+"元");
}
}
Client 使用:
public static void main(String[] args) {
//构造各个领导对象
GroupLeader groupLeader = new GroupLeader();
Director director = new Director();
Manager manager = new Manager();
Boss boss = new Boss();
//设置上一级领导处理者对象
groupLeader.nextHandler = director;
director.nextHandler = manager;
manager.nextHandler = boss;
//发起报账申请
groupLeader.handleRequest(50000);
}
这里面有一个就是 如果组长不在,可以直接找主管报账,这也是责任链模式的灵活之处, 请求的发起可以从责任链的任何一个节点处开始,同时也可以改变责任链内部传递的规则,
责任链中的处理者对象,有两个行为,一是处理请求,二是转发给下一个节点,不允许某个处理者在处理了请求后,又将请求对象转送给上一个节点的情况. 责任链分为两种,一种是 请求被某个处理对象处理, 这个叫纯的责任链. 二是 所有对象均未对其进行处理,这个 是不纯的责任链.