责任链模式(Chain of Responsibility)
来源:互联网 发布:淘宝怎么转接人工服务 编辑:程序博客网 时间:2024/05/01 19:08
以此回顾学习《设计模式之禅》的责任链模式。
什么是责任链模式?
Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it. (为了避免请求者与响应者之间的耦合性,让每个对象都有处理请求的机会。把这些处理请求的对象连成一条链,并沿着这条链传递请求,直到有对象能够处理这个请求为止)
比如失物招领处发出一个认领失物的请求,然后甲乙丙丁都来认领,就把甲乙丙丁串成一条责任链,甲先看看是不是他的物品,不是就传给乙,乙再看看是不是自己的,不是再传给丙,以此类推,直到失物被认领。if...else if....else if....else其实就是责任链模式的小体现。
用责任链模式有什么好处?
像定义中说的,将请求和处理分开,两者解耦,请求者可以不用知道是谁处理的,处理者也可以不用知道是谁请求的。相比if...else if....else,灵活性高一些,耦合度低一些,可读性高一些。
责任链模式有什么缺点?
和if...else一样,责任链模式在找到请求处理者之前,要把链表遍历一遍,如果责任链很长,效率就会低。
什么时候使用责任链模式?
(1)当代码中有很多if..else语句,并且严重影响了可读性的时候,可以考虑重构到责任链模式
(2)如果代码需要添加新的处理请求的类的概率高且频繁,可以考虑责任链模式,责任链模式的灵活性高
如何使用责任链模式?
UML类图:
1、定义一个处理请求的Handler类,可以是抽象类,也可以是接口,一般里面有两个方法(接口),一个是setNext(),用来指定责任链的下一个节点,一个是handle(),用来实现对请求的处理。
2、定义ConcreteHandler类,继承Handler抽象类(实现Handler接口),并实现setNext()和handle()方法。
3、定义场景类(Client),设置ConcreteHandler的顺序,调用第一个ConcreteHandler的handle()方法。
例如,输入两个数,给一个命令(add/sub/mult/div),进行加减乘除运算,用责任链模式实现如下:
UML图
public interface Chain {
void setNextChain(Chain nextChain); void calculate(Numbers request);}Numbers类
public class Numbers { private int number1; private int number2; private String calculateWanted; public Numbers(int number1, int number2, String calculateWanted) { this.number1 = number1; this.number2 = number2; this.calculateWanted = calculateWanted; } public int getNumber1() { return number1; } public int getNumber2() { return number2; } public String getCalculateWanted() { return calculateWanted; }}
AddNumbers类:
public class AddNumbers implements Chain { private Chain nextChain; @Override public void setNextChain(Chain nextChain) { this.nextChain = nextChain; } @Override public void calculate(Numbers request) { if (request.getCalculateWanted().equals("add")) { System.out.println(request.getNumber1() + "+" + request.getNumber2() + "=" (request.getNumber1() + request.getNumber2())); } else { nextChain.calculate(request); } }}
SubNumbers、MultNumbers、DivNumbers也痛AddNumbers结构一样,就不再写了,只是我们吧DivNumbers当作责任链尾,它没有后继节点,所以在DivNumbers中的else语句中输出“Only works for add、sub、mult、div“。
Client类:
public class Client { public static void main(String[] args) { Chain chainCalc1 = new AddNumbers(); Chain chainCalc2 = new SubNumbers(); Chain chainCalc3 = new MultNumbers(); Chain chainCalc4 = new DivNumbers(); chainCalc1.setNextChain(chainCalc2); chainCalc2.setNextChain(chainCalc3); chainCalc3.setNextChain(chainCalc4); Numbers request = new Numbers(4, 2, "add"); chainCalc1.calculate(request); }}
运行结果为:4 + 2 = 6
使用责任链模式有哪些注意事项?
- 责任链模式(Chain of Responsibility)
- 责任链模式(Chain of Responsibility)
- 责任链(chain of responsibility)模式
- 责任链模式(Chain of Responsibility)
- 责任链模式(Chain of Responsibility)
- 责任链模式(Chain of Responsibility)
- 责任链模式(chain of responsibility)
- 责任链模式(Chain of Responsibility)
- 责任链模式(Chain of Responsibility)
- 责任链模式(Chain of Responsibility)
- 责任链模式(Chain of Responsibility)
- 行为型模式-----责任链模式(chain of responsibility)
- 浅谈设计模式:责任链模式(Chain Of Responsibility)
- Java设计模式----责任链模式(Chain of Responsibility)
- 设计模式:责任链模式(Chain of Responsibility)
- 设计模式之---责任链模式(Chain of Responsibility)
- 设计模式:责任链模式(Chain of Responsibility)
- Java责任链模式(Chain of Responsibility模式)
- 游戏引擎起步杂谈
- Beamforming技术在专网宽带无线通信系统中的应用
- javascript函数调用方式总结(共四种)-理解this
- 超实用的样式写法
- 我的c\c++之旅(三)——堆排序
- 责任链模式(Chain of Responsibility)
- Linux搭建SVN服务器
- 前端实践--JavaScript--浏览器对象
- 【JAVA 动态创建风水罗盘 超精华Swing项目方案-项目源码 - 文章04】
- ionic 删除插件
- Reveal的LLDB集成方式
- mysql在windows下的安装
- 序列化和反序列化---学习笔记
- sprintf()函数的用法