0
点赞
收藏
分享

微信扫一扫

设计模式之责任链模式(Chain of Responsibity)


1.解析

定义 :
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

UML :


设计模式之责任链模式(Chain of Responsibity)_System

2.实例

背景描述 :
在前面的场景中 ,我们使用的是餐厅的例子 ,在这里可以继续延用 : 薪资问题
人员结构 :
* 基层 : 服务员 ,洗碗工
* 中层 :大厅经理,后厨主任
* 上层 :总经理
* 高层 :老板
* 强级 :老板娘
场景 :
* 基层 : 想要申请 加薪;
* 中层: 最高给 其 加薪 1000元
* 高层 :最高给其加薪 2000元
* 老板 :最高给其加薪 3000元
* 老板娘 : 最高给其加薪 4000元 或者 “ 不干滚蛋 ”

实现步骤 :

层级结构构建 : 管理层实现

(1)实现 SalaryHandler : 抽象类 ,抽象方法 :addSalary(int salary);

public abstract class SalaryHandler {

//用于构建 责任链 的 链 ,是 所有层级(除了基层)的父类
private SalaryHandler salaryHandler;

public SalaryHandler getSalaryHandler() {
return salaryHandler;
}

public void setSalaryHandler(SalaryHandler salaryHandler) {
this.salaryHandler = salaryHandler;
}

public abstract void addSalary(int salary);

}

(2)中层人员实现 : 大厅经理 ,后厨主任 ,控制加薪 1000元以内

public class ZhongCengHandler extends SalaryHandler {

/**
* 中层实现
*/

@Override
public void addSalary(int salary) {
if(salary<=1000){
System.out.println(this.getClass().getName()+" :给 您加薪 "+salary+" 元");
}else{
getSalaryHandler().addSalary(salary);
}
}

}

(3)高层人员 : 总经理 ,控制加薪 2000元

public class GaoCengHandler extends SalaryHandler{

/**
* 高层实现
*/

@Override
public void addSalary(int salary) {

if(salary<=2000){
System.out.println(this.getClass().getName()+" :给 您加薪 "+salary+" 元");
}else{
getSalaryHandler().addSalary(salary);
}

}

}

(4) Boss 老板 :控制加薪 3000元

public class BossHandler extends SalaryHandler {


/**
* 老板 最多加薪 3000元
*
*/

@Override
public void addSalary(int salary) {
if(salary<3000){
System.out.println(this.getClass().getName()+" :给 您加薪 "+salary+" 元");
}else{
getSalaryHandler().addSalary(salary);
}
}

}

(5) BossWife : 老板娘 ,控制加薪4000元 和 辞员

public class BossWifeHandler extends SalaryHandler{

/**
* 老板娘 4000元
* 或 滚蛋
*/

@Override
public void addSalary(int salary) {
if(salary<4000){
System.out.println(this.getClass().getName()+" :给您加薪 "+salary+" 元");
}else{
System.out.println(this.getClass().getName()+" : 不干滚蛋 !");
}
}

}

层级结构实现 : 关联各个层之间的衔接

(6) SalaryFactory : 使用简单工厂模式 实现 各层之间的关联

public class SalaryFactory {

/**
* 关联起来 所有的 层
*/
public static SalaryHandler getSalaryHandlerInstance(){

ZhongCengHandler zhongCengHandler=new ZhongCengHandler();
GaoCengHandler gaoCengHandler=new GaoCengHandler();
BossHandler bossHandler=new BossHandler();
BossWifeHandler bossWifeHandler=new BossWifeHandler();

//关联
zhongCengHandler.setSalaryHandler(gaoCengHandler);
gaoCengHandler.setSalaryHandler(bossHandler);
bossHandler.setSalaryHandler(bossWifeHandler);

return zhongCengHandler;

}

}

层级结构实现 : 基层实现

(7) JiCengPerson : 基层人员 实现 申请加薪

public class JiCengPerson {

private String name;

public JiCengPerson(String name) {
this.name = name;
}

/**
* 给上级说
*/
public void sayAddSalary(int salary) {
System.out.println(name + " : 我要加薪 " + salary + "元 !!!懂?");
SalaryHandler handler = SalaryFactory.getSalaryHandlerInstance();
handler.addSalary(salary);
}

}

测试实现

(8)测试

public static void main(String[] args) {

//基层提出 加薪
JiCengPerson xw=new JiCengPerson("小王");
xw.sayAddSalary(1100);

JiCengPerson xy=new JiCengPerson("小原");
xy.sayAddSalary(5100);

}

结果 :


设计模式之责任链模式(Chain of Responsibity)_System_02

3.优缺点

优点:
1. 将请求的发送者和接收者解耦 ;
2. 可以简化你的对象,因为它不需要知道链的结构 ;
3. 通过改变链内的成员或调动他们的次序,允许你动态地新增或删除责任;

缺点:
1. 并不保证请求一定会被执行,如果没有任何对象处理它的话,它可能会落到链尾端 之外 ;
2. 可能不容观察运行时的特征,有碍于除错。
3. 开始就会加载很多实例,消耗内存

4.使用场景

(1)有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。

(2)你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。

(3)可处理一个请求的对象集合应被动态指定。



举报

相关推荐

0 条评论