责任链模式(Iterator Pattern或Chain of Responsibility):行为型设计模式之一。链中的每一个环看做链式结构中的节点,编程中我们把节点看做是对象,每一个对象拥有不同的处理逻辑,将一个请求从链式的首端发出,沿着链的路径依次传递给每一个节点对象,直至有对象处理这个请求为止。
1.定义
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
(解释:这样发出这个请求的客户端并不知道这当中的哪一个对象最终处理这个请求)
2.使用场景
- 多个对象可以处理同一请求,但具体由哪个对象处理则在运行时动态决定。
- 在请求处理者不明确的情况下向多个对象中的一个提交一个请求
- 需要动态指定一组对象处理请求
3.UML图
角色介绍:
- Handler:抽象处理者角色,声明一个请求处理的方法,并在其中保持一个对下一个处理节点Handler对象的引用。
- ConcreteHandler1:具体处理者角色,对请求进行处理,如果不能处理则将该请求转发给下一个节点上的处理对象。
4.责任链模式简式通用代码
4.1 抽象处理者
public abstract class Handler {
protected Handler successor;//下一个节点处理者
/**
* 请求处理
* @param condition 请求条件
*/
public abstract void handleRequest(String condition);
}
4.2 具体处理者1
/**
* 具体的处理者1
*/
public class ConcreteHandler1 extends Handler {
@Override
public void handleRequest(String condition) {
if (condition.equals("ConcreteHandler1")){
Log.i("zsf","ConcreteHandler1 handled");
return;
} else {
successor.handleRequest(condition);
}
}
}
4.3 具体处理者2
/**
* 具体的处理者2
*/
public class ConcreteHandler2 extends Handler {
@Override
public void handleRequest(String condition) {
if (condition.equals("ConcreteHandler2")){
Log.i("zsf","ConcreteHandler2 handled");
return;
} else {
successor.handleRequest(condition);
}
}
}
4.4 客户类
public class IteratorClientActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//构造一个ConcreteHandler1对象
ConcreteHandler1 handler1 = new ConcreteHandler1();
//构造一个ConcreteHandler2对象
ConcreteHandler2 handler2 = new ConcreteHandler2();
//设置handler1的下一个节点
handler1.successor = handler2;
//设置handler2的下一个节点
handler2.successor = handler1;
//处理请求
handler1.handleRequest("ConcreteHandler2");
}
}
4.5 Log日志
05-03 19:22:33.415 1976-1976/? I/zsf: ConcreteHandler2 handled
实际中,遇到的情况往往更复杂,责任链中的请求和对应的处理规则是不尽相同的,这种情况下可以将请求进行封装,同时对请求的处理规则也进行封装作为一个独立的对象。类图参考如下:
6.责任链模式的简单实现
6.1 抽象领导者
/**
* 抽象领导者
* 1.定义了两个抽象接口方法来确定一个领导者应有的属性和行为
* 2.声明了一个处理报账请求的方法来确定当前领导是否有能力处理报账请求,若无,则转发给上级领导处理
*/
public abstract class Leader {
protected Leader nextHandler;//上一级的领导
/**
* 处理报账请求
*
* @param money 能批复的报账额度
*/
public final void handleRequest(int money) {
if (money <= limit()) {
handle(money);
} else {
if (null != nextHandler) {
nextHandler.handleRequest(money);
}
}
}
/**
* 自身能批复的额度权限
*
* @return 额度
*/
public abstract int limit();
/**
* 处理报账行为
*
* @param money 具体金额
*/
public abstract void handle(int money);
}
/**
* 组长领导级
*/
public class GroupLeader extends Leader {
@Override
public int limit() {
return 1000;//只能处理1000以下的
}
@Override
public void handle(int money) {
Log.i("zsf","组长批复报销" + money + "元");
}
}
/**
* 主管级
*/
public class Director extends Leader {
@Override
public int limit() {
return 5000;
}
@Override
public void handle(int money) {
Log.i("zsf","主管批复报销" + money + "元");
}
}
/**
* 经理级
*/
public class Manager extends Leader {
@Override
public int limit() {
return 10000;
}
@Override
public void handle(int money) {
Log.i("zsf","经理批复报销" + money + "元");
}
}
/**
* 老板级
*/
public class Boss extends Leader {
@Override
public int limit() {
return Integer.MAX_VALUE;
}
@Override
public void handle(int money) {
Log.i("zsf","老板批复报销" + money + "元");
}
}
6.3 客户端发起请求
public class ExpenseAccountTestActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//各个领导级别
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);
}
}
6.4 Log输出
05-03 21:49:22.378 17634-17634/? I/zsf: 老板批复报销50000元