- 一、导语
- 二、怎么用
1.样例背景
2.UML类图
3.代码示例- 三、优缺点
- 四、使用场景
1.概括描述
2.现存知名产品中的使用示例- 五、相关设计模式
- 六、参考
一、导语
责任链模式(Chain of responsibility),使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。
二、怎么用
共有2个示例,代码详见访问链接
下面以example2举例说明
1. 样例背景
员工向领导提涨薪
部门领导(0,1000] --> 人事总监(1000,3000] --> 老板 (3000,正无穷)
2. UML类图
Leader ------------------- 抽象的责任链对象
DepartmentManager ---------------- 实际的责任链对象
Boss ----------------------------- 实际的责任链对象
HR --------------------------- 实际的责任链对象
Salary ---------------------------- 实际的请求内容
3. 代码示例
/**
* description: 领导们的抽象类
*/
public abstract class Leader {
protected Leader leader;
protected void setNextLeader(Leader leader) {
this.leader = leader;
}
abstract void approve(Salary salary);
}
/**
* description: 部门主管
*/
public class DepartmentManager extends Leader {
@Override
void approve(Salary salary) {
if (salary.getMoney() <= 1000 && salary.getMoney() > 0) {
System.out.println("我是【"
+ this.getClass().getSimpleName()
+ "】,这个数归我管,但是老纸不批");
}else {
System.out.println("我是【"
+ this.getClass().getSimpleName()
+ "】, 不归我管,别烦我!");
if (leader != null) {
leader.approve(salary);
}
}
}
}
/**
* description: HR
*/
public class HR extends Leader {
@Override
void approve(Salary salary) {
if (salary.getMoney() <= 3000 && salary.getMoney() > 1000) {
System.out.println("我是【"
+ this.getClass().getSimpleName()
+ "】,这个数归我管,但是老纸不批");
}else {
System.out.println("我是【"
+ this.getClass().getSimpleName()
+ "】, 不归我管,别烦我!");
if (leader != null) {
leader.approve(salary);
}
}
}
}
/**
* description: 老板
*/
public class Boss extends Leader {
@Override
void approve(Salary salary) {
if (salary.getMoney() > 3000) {
System.out.println("我是【"
+ this.getClass().getSimpleName()
+ "】,这个数归我管,但是老纸不批");
}else {
System.out.println("我是【"
+ this.getClass().getSimpleName()
+ "】, 不归我管,别烦我!");
if (leader != null) {
leader.approve(salary);
}
}
}
}
/**
* description: 薪水 (将要被审批的事物)
*/
public class Salary {
@Getter
private int money;
public Salary(int money) {
this.money = money;
}
}
public class Test {
public static void main(String[] args) {
Salary salary = new Salary(2500);
Boss boss = new Boss();
HR hr = new HR();
DepartmentManager departmentManager = new DepartmentManager();
departmentManager.setNextLeader(hr);
hr.setNextLeader(boss);
departmentManager.approve(salary);
}
}
执行结果
我是【DepartmentManager】, 不归我管,别烦我!
我是【HR】,这个数归我管,但是老纸不批
三、优缺点
-
缺点
1.责任链太长或者处理时间过长,影响性能 -
优点
1.请求的发送者和处理者解耦
2.责任链可以动态的组合
四、使用场景
1. 概括描述
- 一个请求处理需要多个对象当中的一个或几个协作处理
2. 现存知名产品中的使用示例 todo
2.1 javax.servlet.Filter (tomcat)
五、与其他设计模式的对比
1. 责任链模式和状态模式
在责任链模式中,各个对象并不指定下一个处理的对象是谁,只有在客户端,设定链条中的顺序及元素,直到被某个链元素所处理,或者整个链条结束。
状态模式,是让每个状态知道自己下一个处理的对象是谁,也就是说在编译时就设定好了。
这个就是他们最大的区别。
网友评论