场景:去售楼处买方/击鼓传花游戏
什么是责任链模式
将接受者对象连成一条链,并在该链上传递请求,直到有一个接受者对象处理它。通过让更多的对象有机会处理请求,避免了请求发送者和接受者之间的耦合。
后继:successor,遵循了oo中的依赖倒置原则
用户的请求:customer请求折扣
如何实现责任链模式
请求方,用户发起申请折扣的请求:
请求传递的条件:价格处理人,处理折扣的请求
责任链的每一个handler(每一个折扣处理者的处理handler):
责任链模式如何解耦
如何在销售和manager之上,添加一个权限层级lead小组长?
a.只需要添加一个handler,代表新的层级。
b.对工厂方法添加传递条件,从销售后继到lead,lead后继到manager(给lead设置了后继Successor)
对PriceHandler 的解耦?将工厂方法从抽象方法中提出来
将指定的方法移到某个文件中的快捷键操作方式:
选中方法名——Refactor——Move——选择需要移动到的目标文件——确定
责任链的实现:
1、OO的一些原则的单一职责原则 : 设置一个接口时,应该只将与这个接口业务相关的方法放在接口之中。一个方法只做一件事情
2、工场方法的实质在用返回值不在于参数,返回了一个抽象对象 PriceHandler,而非实质对象 (无论内部是sales,还是lead,它的实质是抽象对象)
3、用到责任链,总会用到工厂
责任链模式的应用
场景1:Java后端中的异常处理过程
场景2:前端JavaScript 的事件模型
场景3:JavaEE中的Filter :典型的Spring Security 权限框架
评价责任链模式
1.开闭原则(OCP):面向对象OO思想的重要原则( 对扩展开放, 对变更关闭)
在不修改现有代码的基础上,引入新功能。开闭原则中“开”,是指对于组件功能的扩展是开放的,是允许对其进行功能扩展的;开闭原则中“闭”,是指对于原有代码的修改是封闭的,即修改原有的代码对外部的使用是透明的。
2.执行效率(性能的损耗):
时间:在单个hander对象的时间很短,但是在遍历整条链时会花费较长的时间
内存:在创建整条链时,会创建很多类,真正使用只有一小部分, 导致内存增加
3.责任链模式 解耦, 低耦合