设计模式——责任链模式(职责连模式)
2017-01-03 本文已影响52人
SyncAny
简述
责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。——《Java与模式》
以下场景可以考虑使用责任链模式
1、有多个对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定;
2、在不明确指定接收者的情况下,向多个对象中的一个,提交一个请求;
3、处理一个请求的对象集合应被动态指定。
代码实例
我们这里以以申请旅游资金为例,各职能资金批准权限, 申请流程:秘书(500)--主管(1000)--经理(大于1000)
1、 首先定义我们的抽象类。
public abstract class MyHanlder {
/**
* 下一个处理者
*/
private MyHanlder nextHanlder;
public MyHanlder getNextHanlder() {
return nextHanlder;
}
public void setNextHanlder(MyHanlder nextHanlder) {
this.nextHanlder = nextHanlder;
}
//发送一个请求,参数自定义
public abstract void handlerRequest(String user,double money);
}
2、 定义我们的秘书(SecretaryHandler)、主管(SupervisorHandler)、经理(ManagerHandler)等
public class SecretaryHandler extends MyHanlder{
@Override
public void handlerRequest(String user, double money) {
if(money <=500){
Log.d("w", "秘书:资金小于500,我来批准执行,不需要申请");
}else{
if(getNextHanlder() != null){
Log.d("w", "秘书:资金大于500,我不能批准,需要申请");
getNextHanlder().handlerRequest(user, money);
}else{
Log.d("w", "秘书:资金大于500,我不能批准,但是我领导不在...");
}
}
}
}
"主管、经理和秘书的代码基本一致,都是根据要求行使自己的职能,暂不列出"
3、开始进行资金申请测试
//实例化三个不同的责任人
SecretaryHandler secretaryHandler = new SecretaryHandler();
SupervisorHandler supervisorHandler = new SupervisorHandler();
ManagerHandler managerHandler = new ManagerHandler();
//秘书设置下一个责任人
secretaryHandler.setNextHanlder(supervisorHandler);
//主管设置下一个责任人
supervisorHandler.setNextHanlder(managerHandler);
//秘书开始申请
secretaryHandler.handlerRequest("", 7089);
//supervisorHandler.handlerRequest("", 999);
"1. 秘书、主管、经理都可以进行申请"
"2. 三者可以任意设置下一个责任人,不一定是秘书--主管,也可以是秘书--经理 "
4、测试结果
"假设秘书申请资金为9999元,结果如下:"
秘书:资金大于500,我不能批准,需要申请
主管:资金大于1000,我不能批准,需要申请
经理:资金大于1000,批准你们了,流程结束
总结
- 责任链内部可以动态的去指定继承者,不一定要求按照特定的顺序;
- 责任链可以从任一关开始,不一定是必须从头开始