设计模式之责任链模式
一、概述
1、简介
- 行为设计模式
- 链式结构:将每一个节点看作一个对象,每一个对象拥有不同的处理逻辑,将一个请求从链式的首端发出,沿着链的路径依次传递给每一个节点对象,直至有对象处理这个请求为止
2、定义
- 使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止
3、使用场景
- 多个对象可以处理同一请求,但具体由哪个对象处理则在运行时动态决定
- 在请求处理者不明确的情况下向多个对象中的一个提交一个请求
- 需要动态指定一组对象处理请求
4、优缺点
-
优点:
- 对请求者和处理者关系解耦,提高代码灵活性
-
缺点:
- 对链中请求处理者的遍历,影响性能
5、UML类图
-
(1)Handler:抽象处理者。声明一个请求处理的方法,并在其中保持一个对下一个处理节点Handler对象的引用
- ①定义handleRequest()方法,实现责任链的主要逻辑
- ②声明下一级处理者对象
- ③声明处理者对象的处理级别
- ④声明具体的处理事件方法
-
(2)ConcreteHandler:具体处理者。对请求进行处理,如果不能处理则将请求转发给下一个节点上的处理对象
- 行为1:被某个处理对象所处理
- 行为2:将请求转送给下一个节点
6、注意点
-
一个请求最终只有两种情况
- 纯的责任链:被某个处理对象所处理
- 不纯的责任链(常见):所有对象均未对其进行处理
-
通常请求的参数也可进行抽象,然后再进行具体实现
二、实现
- 场景:报账,不同的领导有不同的批准额度
1、抽象责任人
public abstract class Leader {
protected Leader nextHandler;// 下一级处理者
/**
* 处理报账请求
* @param money 能批复的报账额度
*/
public final void handleRequest(int money){
System.out.println(getLeader());
if(money <=limit()){
handle(money);
}else{
System.out.println("报账额度不足,提交领导");
if(null != nextHandler){
nextHandler.handleRequest(money);
}
}
}
/**
* 自身能批复的额度权限
* @return 额度
*/
public abstract int limit();
/**
* 处理报账行为
* @param money 具体金额
*/
public abstract void handle(int money);
/**
* 获取处理者
* @return 处理者
*/
public abstract String getLeader();
}
2、具体责任人
- 组长
public class GroupLeader extends Leader{
@Override
public int limit() {
return 1000;
}
@Override
public void handle(int money) {
System.out.println("组长批复报销"+ money +"元");
}
@Override
public String getLeader() {
return "当前是组长";
}
}
- 主管
public class Director extends Leader{
@Override
public int limit() {
return 5000;
}
@Override
public void handle(int money) {
System.out.println("主管批复报销"+ money +"元");
}
@Override
public String getLeader() {
return "当前是主管";
}
}
- 经理
public class Manager extends Leader{
@Override
public int limit() {
return 10000;
}
@Override
public void handle(int money) {
System.out.println("经理批复报销"+ money +"元");
}
@Override
public String getLeader() {
return "当前是经理";
}
}
- 老板
public class Boss extends Leader{
@Override
public int limit() {
return Integer.MAX_VALUE;
}
@Override
public void handle(int money) {
System.out.println("老板批复报销"+ money +"元");
}
@Override
public String getLeader() {
return "当前是老板";
}
}
3、Test(Client)
public class 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(8000);
}
}