【设计模式 - 13】之责任链模式(Chain Of Responsibility)
来源:互联网 发布:网络咨询公司经营范围 编辑:程序博客网 时间:2024/04/29 09:42
1 模式简介
责任链模式的简介:
1. 责任链模式为请求创建了一个接收者对象的链,每个接收者都包含对另一个接收者的引用,如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。
2. 责任链模式避免了请求的发送者和接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
3. 责任链上的处理者负责处理请求,客户只需要将请求发送到责任链上即可,无需关心请求的处理细节和请求的传递,所以责任链模式将请求的发送者和接收者解耦了。
责任链模式的优点:
1) 降低耦合度。它将请求的发送者和接收者解耦;
2) 简化了对象。使得对象不需要知道链的结构;
3) 增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任;
4) 增加新的请求处理类很方便。
责任链模式的缺点:
1) 不能保证请求一定被接收;
2) 系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用;
3) 可能不容易观察运行时的特征,有碍于除错。
责任链模式的适用场景:
1) 有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定;
2) 在不明确指定接收者的情况下,向多个对象中的某一个对象提交一个请求;
3) 可动态指定一组对象的处理请求。
2 案例
在这个例子中,我们定义了一个责任链,其中有三个节点,分别是ConcreteHandler1、ConcreteHandler2和ConcreteHandler3。每个节点都是先判断传过来的消息是否是自己能够解决的,如果是则解决,否则继续传递给下一个节点处理。
代码如下:
责任处理节点的抽象父类Handler的代码:
public abstract class Handler {protected Handler nextHandler; // 下一个责任链成员public Handler getNextHandler() {return nextHandler;}public void setNextHandler(Handler nextHandler) {this.nextHandler = nextHandler;}// 处理传递过来的时间public abstract void handleMessage(int type);}第一个责任处理节点ConcreteHandler1中的代码:
public class ConcreteHandler1 extends Handler {@Overridepublic void handleMessage(int type) {if (type == 1 || type == 3) {System.out.println("ConcreteHandler1解决了问题!");} else {System.out.println("ConcreteHandler1解决不了问题......");if (nextHandler != null) {nextHandler.handleMessage(type);} else {System.out.println("没有人能处理这个消息");}}}}第二个和第三个责任处理节点中的代码和第一个的代码大同小异,这里就不贴了,有需要的可以通过博客最下方的GitHub地址去GitHub中下载代码。
测试类Test中的代码如下:
public class Test {public static void main(String[] args) {// 初始化责任链:handler1 -> handler2 -> handler3Handler handler1 = new ConcreteHandler1();Handler handler2 = new ConcreteHandler2();Handler handler3 = new ConcreteHandler3();handler2.setNextHandler(handler3);handler1.setNextHandler(handler2);// 处理事件System.out.println("--------------Message1");handler1.handleMessage(1);System.out.println("--------------Message2");handler1.handleMessage(2);System.out.println("--------------Message3");handler1.handleMessage(4);System.out.println("--------------Message4");handler1.handleMessage(7);}}运行结果如下图所示:
最后贴出责任链模式的GitHub代码地址:【GitHub - Chain Of Responsibility】。
- 设计模式之13 - 责任链模式Chain Of Responsibility
- 设计模式之---责任链模式(Chain of Responsibility)
- 设计模式之责任链模式(Chain of Responsibility)
- 设计模式之责任链(Chain of Responsibility)
- 设计模式之-责任链(Chain of responsibility )
- 设计模式之责任链Chain of Responsibility模式
- 设计模式之责任链模式(Chain of Responsibility)
- 设计模式之责任链模式--- Pattern chain-of-responsibility
- 设计模式拾荒之责任链模式 ( Chain of Responsibility)
- 【设计模式 - 13】之责任链模式(Chain Of Responsibility)
- 浅谈设计模式:责任链模式(Chain Of Responsibility)
- Java设计模式----责任链模式(Chain of Responsibility)
- 设计模式:责任链模式(Chain of Responsibility)
- 设计模式:责任链模式(Chain of Responsibility)
- 设计模式:责任链模式(Chain of Responsibility)
- 设计模式(17)-责任链模式(Chain of Responsibility)
- 设计模式_责任链模式(Chain Of Responsibility)
- [设计模式]责任链模式(Chain of Responsibility)
- iOS多线程安全的几种解决方案以及性能对比
- 如何查看某个端口被谁占用
- mysql源码调试
- 10016---kafka 集群--3个broker 3个zookeeper创建实战
- R语言 第三方软件包的下载及安装
- 【设计模式 - 13】之责任链模式(Chain Of Responsibility)
- 2016计科学院ACM院赛题解
- 16 - 12 - 11 二叉排序树
- http协议 request,respones 笔记
- 如果mysql的root密码丢了,如何在mac上重置mysql的root
- position属性在父级元素和子级元素中的影响
- java se学习笔记 JAVA概述
- WordPress 4.7“Vaughan”
- 用户栈与系统栈的区别