系列文章目录
创建型模式 - 单例模式(一)
创建型模式 - 工厂模式(二)
创建型模式 - 原型模式(三)
创建型模式 - 建造者模式(四)
结构型模式 - 适配器模式(一)
结构型模式 - 桥接模式(二)
结构型模式 - 装饰器模式(三)
结构型模式 - 组合模式(四)
结构型模式 - 外观模式(五)
结构型模式 - 享元模式(六)
结构型模式 - 代理模式(七)
行为型模式 - 模板方法模式(一)
行为型模式 - 命令模式(二)
行为型模式 - 访问者模式(三)
行为型模式 - 迭代器模式(四)
行为型模式 - 观察者模式(五)
行为型模式 - 中介者模式(六)
行为型模式 - 备忘录模式(七)
行为型模式 - 解释器模式(八)
行为型模式 - 状态模式(九)
行为型模式 - 策略模式(十)
行为型模式 - 责任链模式(十一)
文章目录
前言
一、责任链模式
1.1 责任链模式介绍
- 责任链(Observer)模式:
- 为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一个对象记住下一个对象的引用连成一条链,当有请求发生时,可将请求沿着这条链传递,知道有对象处理它为止;
1.2 责任链模式结构
- 抽象处理者(Mediator)角色:
- 定义一个处理请求的接口,包含抽象处理方法和一个后续链接;
- 具体处理者(Concrete Mediator)角色:
- 实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理则处理,否则将请求转给它的后继者,从而形成一个职责链;
- 客户类(Colleague)角色:
- 创建处理链,并向链头的具体处理者对象提交请求,它不关系处理细节和请求的传递过程;
二、实现
例子:
- 码农张三是个苦逼的脑力活动者,一天实在受不了997福报了于是找到主管说:世界那么大,我想去看看,给我来一个月假;
- 主管李四看了看张三的请假申请:这个张三请那么久的假是不是不想干了,还想出去看看,我还想出去看看呢,不行请假时间太久,我没权批,转给经理批吧;
- 经理王五看了张三的请假大手一挥,997福报都不知道享受,滚你的蛋吧!
2.1 责任链实现
package com.dozezz.designpattern.chain;
/**
* 抽象处理类
*/
public abstract class Handler {
private Handler nextHandler;
public void setNextHandler(Handler handler){
this.nextHandler = handler;
}
public Handler getNextHandler() {
return nextHandler;
}
/**
* 处理请求
*/
public abstract void handlerRequest(Integer info);
}
package com.dozezz.designpattern.chain;
/**
* 具体处理者
*/
public class BossConcreteHandler extends Handler{
@Override
public void handlerRequest(Integer info) {
if (info >= 5) {
System.out.println(String.format("部门经理批准申请 %d 假期", info));
} else {
getNextHandler().handlerRequest(info);
}
}
}
package com.dozezz.designpattern.chain;
/**
* 具体处理者
*/
public class LeaderConcreteHandler extends Handler {
@Override
public void handlerRequest(Integer info) {
if (info < 5) {
System.out.println(String.format("归属领导批准申请 %d 假期", info));
} else {
getNextHandler().handlerRequest(info);
}
}
}
package com.dozezz.designpattern.chain;
/**
* 主测试类
*/
public class ClientTest {
public static void main(String[] args) {
Handler bossConcreteHandler = new BossConcreteHandler();
Handler leaderConcreteHandler = new LeaderConcreteHandler();
leaderConcreteHandler.setNextHandler(bossConcreteHandler);
leaderConcreteHandler.handlerRequest(100);
leaderConcreteHandler.handlerRequest(2);
}
}
三、责任链模式总结
3.1 责任链的应用场景
- 多个对象可以处理一个请求,但是具体由那个对象处理该请求在运行时自动确定;
- 可以动态制定一组对象处理请求;
- 需要在不确定指定请求处理者的情况下,向多个处理者中的一个提交请求;
3.2 责任链模式、状态模式区别
- 需要知;种模式都可以使用;
- 状态模式强调的是一个对象内在状态的改变,而责任链模式强调的是外部节点对象间的改变;
- 从代码层面实现看,两者最大的区别就是状态模式的各个状态知道自己要进入的下一个状态对象,而责任链模式并不清楚其下一个节点对象,因为链式组装由客户端负责;
3.3 责任链模式总结
- 责任链模式将请求与处理分开,实现解耦,提高系统的灵活性;
- 简化了对象,使对象不需要知道链的结构;
- 性能会受到影响,特别是在链比较长的时候,因此需要控制链中最大节点数量;
- 调试不方便,采用了类似递归的方式,调试时逻辑可能比较复杂;
四、参考文献
- http://c.biancheng.net/view/1390.html
- https://www.cnblogs.com/noteless/p/10178477.html
- https://www.bilibili.com/video/BV1G4411c7N4?p=54&spm_id_from=pageDriver