23.职责链模式
职责链模式中:每个接收者都包含另外一个接受者的引用,如果一个对象不能处理请求,那么就会把相同的请求传给下一个接收者
抽象类
public abstract class Handler { //后继者,即如果处理不了请求要把任务丢给谁 private Handler successor; public Handler getSuccessor() { return successor; } public void setSuccessor(Handler successor) { this.successor = successor; } public abstract void HandleRequest(int num); }
三个实现类和客户端
/** * @author wuyimin * @create 2021-07-29 19:21 * @description 导师类,最抠门的类 */ public class Teacher extends Handler { @Override public void HandleRequest(int num) { if(num<=600){ System.out.println("抠门的导师接受了你的请求给了你"+num+"人民币"); }else{ System.out.println("你的导师不想给你钱"); getSuccessor().HandleRequest(num); } } } /** * @author wuyimin * @create 2021-07-29 19:25 * @description 兄弟类 */ public class Brother extends Handler { @Override public void HandleRequest(int num) { if(num<=2000){ System.out.println("你的好兄弟答应了要借你"+num+"元"); }else{ System.out.println("你的好兄弟没有那么多钱"); getSuccessor().HandleRequest(num); } } } /** * @author wuyimin * @create 2021-07-29 19:26 * @description 爹妈类 */ public class Parent extends Handler { @Override public void HandleRequest(int num) { System.out.println("你的爹妈借了你"+num+"元"); } public static void main(String[] args) { Brother brother = new Brother(); Teacher teacher = new Teacher(); Parent parent = new Parent(); teacher.setSuccessor(brother); brother.setSuccessor(parent); teacher.HandleRequest(5000); } }
优点在于:
1. 改变内部的传递规则
在内部,项目经理完全可以跳过人事部到那一关直接找到总经理。
每个人都可以去动态地指定他的继任者。
2. 可以从职责链任何一关开始。
如果项目经理不在,可以直接去找部门经理,责任链还会继续,没有影响。
3.用与不用的区别
不用职责链的结构,我们需要和公司中的每一个层级都发生耦合关系。
如果反映在代码上即使我们需要在一个类中去写上很多丑陋的if….else语句。
如果用了职责链,相当于我们面对的是一个黑箱,我们只需要认识其中的一个部门,然后让黑箱内部去负责传递就好了
纯的与不纯的责任链模式
一个纯的责任链模式要求一个具体的处理者对象只能在两个行为中选择一个:一是承担责任,而是把责任推给下家。不允许出现某一个具体处理者对象在承担了一部分责任后又 把责任向下传的情况。
在一个纯的责任链模式里面,一个请求必须被某一个处理者对象所接收;在一个不纯的责任链模式里面,一个请求可以最终不被任何接收端对象所接收。
纯的责任链模式的实际例子很难找到,一般看到的例子均是不纯的责任链模式的实现。