北风设计模式课程---22、责任链模式
一、总结
一句话总结:
设置了级别的场景:责任链适合那些已经设置了级别的场景,
都有对应的抽象类:面向对象这些设计模式,处理类或者工厂类都有对应的抽象类,比如这里责任链模式的 处理类的抽象父类,作用自然是满足 开闭原则。
1、责任链模式代码如何实现?
|||-begin
package com.ibeifeng.ex2; public abstract class CarHandler { protected CarHandler carHandler; public CarHandler setNextHandler(CarHandler carHandler) { this.carHandler = carHandler; return this.carHandler; } public abstract void HandlerCar(); }
|||-end
1、知道下一级别对象:类之间链成了一条线,每个类知道下一个级别的对象,便于通知下一个级别
2、抽象类中指定:直接在抽象类中指定下一级,就不需要分别在每个类中去设计了
2、责任链模式如何在外部灵活的指定执行顺序?
|||-begin
1、处理类抽象类 package com.ibeifeng.ex2; public abstract class CarHandler { protected CarHandler carHandler; public CarHandler setNextHandler(CarHandler carHandler) { this.carHandler = carHandler; return this.carHandler; } public abstract void HandlerCar(); }
2、处理类具体类:比如车头处理类 package com.ibeifeng.ex2; public class CarHeadHandler extends CarHandler{ public void HandlerCar() { System.out.println("组装车头"); if(this.carHandler != null) { this.carHandler.HandlerCar(); } } }
/3、客户端实现 //顺序改变,希望是车身-->车头--车尾 bodyH.setNextHandler(headH); headH.setNextHandler(tailH); bodyH.HandlerCar();
|||-end
执行抽象类中的setNextHandler方法:这个方法用于接收下一级的对象,有了对象,自然很方便的执行这个方法
3、责任链模式如何 链式执行?
|||-begin
处理类抽象类 package com.ibeifeng.ex2; public abstract class CarHandler { protected CarHandler carHandler; public CarHandler setNextHandler(CarHandler carHandler) { this.carHandler = carHandler; return this.carHandler; } public abstract void HandlerCar(); }
客户端链式实现 //简便操作 bodyH.setNextHandler(headH).setNextHandler(tailH); bodyH.HandlerCar();
|||-end
链式执行核心操作是抽象类中setNextHandler方法返回下一级对象:return this.carHandler;
4、责任链模式的好处是什么?
1、解决这种级别问题
2、可以灵活指定用户是否知道内部的执行流程:用户可以无需管内部如何执行,要是用户知道 类之间的执行流程,用户也可以直接指定
5、用户 无需管内部如何执行的 设计模式有哪些?
责任链模式(也可以设置为控制内部的执行顺序)、外观模式
6、什么是职责链模式?
类的对象之间像链条一样紧密相连
Chain of Responsibility(CoR)模式也叫职
责链模式或者职责连锁模式,是行为模式之一,
该模式构造一系列分别担当不同的职责的类的对
象来共同完成一个任务,这些类的对象之间像链
条一样紧密相连,所以被称作职责链模式
7、职责链模式的应用场景?
例1:比如客户Client要完成一个任务,这个任务包括a,b,c,d四个部分。首先客户Client把任务交给A,A完成a部分之后,把任务交给B,B完成b部分,...,直到D完成d部分。
例2:比如政府部分的某项工作,县政府先完成自己能处理的部分,不能处理的部分交给省政府,省政府再完成自己职责范围内的部分,不能处理的部分交给中央政府,中央政府最后完成该项工作。
例3:软件窗口的消息传播。
例4:SERVLET容器的过滤器(Filter)框架实现。
8、职责链模式的基本条件?
1,对象链的组织:需要将某任务的所有职责执行对象以链的形式加以组织。
2,消息或请求的传递:将消息或请求沿着对象链传递,以让处于对象链中的对象得到处理机会。
3,处于对象链中的对象的职责分配:不同的对象完成不同的职责。
4,任务的完成:处于对象链的末尾的对象结束任务并停止消息或请求的继续传递。
要实现Chain of Responsibility模式,需要满足该模式的基本条件:
1,对象链的组织。需要将某任务的所有职责执行对象以链的形式加以组织。
2,消息或请求的传递。将消息或请求沿着对象链传递,以让处于对象链中的对象得到处理机会。
3,处于对象链中的对象的职责分配。不同的对象完成不同的职责。
4,任务的完成。处于对象链的末尾的对象结束任务并停止消息或请求的继续传递。
9、职责链模式的优缺点?
优点1:责任的分担:每个类只需要处理自己该处理的工作(不该处理的传递给下一个对象完成),明确各类的责任范围,符合类的最小封装原则。
优点2:自由组合工作流程:可以根据需要自由组合工作流程。如工作流程发生变化,可以通过重新分配对象链便可适应新的工作流程。
优点3:松耦合:类与类之间可以以松耦合的形式加以组织。
缺点1:处理速度:因为处理时以链的形式在对象间传递消息,根据实现方式不同,有可能会影响处理的速度。
10、职责链模式的角色和职责?
Handler:处理类的抽象父类。:CarHandler.java
concreteHandler:具体的处理类。:CarHeadHandler.java;CarBodyHandler.java;CarTailHandler.java
二、内容在总结中
1、相关知识
Handler:处理类的抽象父类。:CarHandler.java
concreteHandler:具体的处理类。:CarHeadHandler.java;CarBodyHandler.java;CarTailHandler.java
2、代码
Handler:处理类的抽象父类。:CarHandler.java
package com.ibeifeng.ex2; public abstract class CarHandler { protected CarHandler carHandler; public CarHandler setNextHandler(CarHandler carHandler) { this.carHandler = carHandler; return this.carHandler; } public abstract void HandlerCar(); }
concreteHandler:具体的处理类。:CarHeadHandler.java;CarBodyHandler.java;CarTailHandler.java
CarHeadHandler.java;
package com.ibeifeng.ex2; public class CarHeadHandler extends CarHandler{ public void HandlerCar() { System.out.println("组装车头"); if(this.carHandler != null) { this.carHandler.HandlerCar(); } } }
CarBodyHandler.java;
package com.ibeifeng.ex2; public class CarBodyHandler extends CarHandler { public void HandlerCar() { System.out.println("ΧιΧ°³΅Ιν"); if(this.carHandler != null) { this.carHandler.HandlerCar(); } } }
CarTailHandler.java
package com.ibeifeng.ex2; public class CarTailHandler extends CarHandler{ public void HandlerCar() { System.out.println("ΧιΧ°³΅Ξ²"); if(this.carHandler != null) { this.carHandler.HandlerCar(); } } }
客户端实现:
package com.ibeifeng.ex2; public class MainClass { public static void main(String[] args) { CarHandler headH = new CarHeadHandler(); CarHandler bodyH = new CarBodyHandler(); CarHandler tailH = new CarTailHandler(); //组装顺序预先设定好,顺序是车头-->车身-->车尾 headH.setNextHandler(bodyH); bodyH.setNextHandler(tailH); //调用职责链的链头来完成操作 headH.HandlerCar(); System.out.println("---------------"); //顺序改变,希望是车身-->车头--车尾 bodyH.setNextHandler(headH); headH.setNextHandler(tailH); bodyH.HandlerCar(); //简便操作 bodyH.setNextHandler(headH).setNextHandler(tailH); bodyH.HandlerCar(); } }