public class CarBodyHandler extends CarHandler{@Overridepublic void HandlerCar() {// TODO Auto-generated method stubSystem.out.println("组装车身");}}
public abstract class CarHandler {public abstract void HandlerCar(); }
public class CarHeadHandler extends CarHandler{@Overridepublic void HandlerCar() {// TODO Auto-generated method stubSystem.out.println("组装车头");}}
public class CarTailHandler extends CarHandler{@Overridepublic void HandlerCar() {// TODO Auto-generated method stubSystem.out.println("组装车尾.");}}
public class MainClass {public static void main(String[] args) {CarHandler headH = new CarHeadHandler();CarHandler bodyH = new CarBodyHandler();CarHandler tailH = new CarTailHandler();//这种方式的缺点是客户端必须手动地调用HandlerCar()//像SERVLET的容器的过滤器的框架的实现是自动的.//就是组装完车头之后你自己组装车身,组装车尾.//我把一个流程给你以后:是先组装车头还是先组装车身.你按照我给定的流程你来执行.//对象的组织-消息的传递-职责的分配-任务的完成 headH.HandlerCar();bodyH.HandlerCar();tailH.HandlerCar();} }
这是非责任链模式的代码.组装一辆汽车的应用场景.
ConcreteHandler:CarHeadHandler.java、CarTailHandler.java、CarBodyHandler.java
Handler:CarHandler.java Hander有一条线是对自身的引用.
车头持有车身的引用,车身持有车尾的引用.每次执行完自己的方法的时候调用下一个节点的方法继续执行.
缺点:因为一个对象总是要调用链的下一个对象进行处理,如果中间有一个对象或者是实现出现了问题就会影响处理速度.
package com.ibeifeng.ex2;public class CarBodyHandler extends CarHandler{@Overridepublic void HandlerCar() {// TODO Auto-generated method stubSystem.out.println("组装车身");if(this.carHandler!=null){this.carHandler.HandlerCar();}}}
package com.ibeifeng.ex2;public class CarHeadHandler extends CarHandler{@Overridepublic void HandlerCar() {// TODO Auto-generated method stubSystem.out.println("组装车头");if(this.carHandler!=null){this.carHandler.HandlerCar();}}}
package com.ibeifeng.ex2;public class CarTailHandler extends CarHandler{@Overridepublic void HandlerCar() {// TODO Auto-generated method stubSystem.out.println("组装车尾.");if(this.carHandler!=null){this.carHandler.HandlerCar();}}}
package com.ibeifeng.ex2;public abstract class CarHandler {protected CarHandler carHandler;//protected属性子类可以访问...//private CarHandler carHandler;//持有自身的引用./* public void setNextHandler(CarHandler carHandler){this.carHandler = carHandler;}*/public CarHandler setNextHandler(CarHandler carHandler){this.carHandler = carHandler;return this.carHandler;}public abstract void 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();//这种方式的缺点是客户端必须手动地调用HandlerCar()//像SERVLET的容器的过滤器的框架的实现是自动的.//就是组装完车头之后你自己组装车身,组装车尾.//我把一个流程给你以后:是先组装车头还是先组装车身.你按照我给定的流程你来执行.//对象的组织-消息的传递-职责的分配-任务的完成 /* headH.HandlerCar();bodyH.HandlerCar();tailH.HandlerCar();*///不需要调用三个类的方法了,而是把顺序预先设定好.//组装顺序预先设定好,顺序是车头->车身->车尾headH.setNextHandler(bodyH);//把第二个设置到第一个里面 bodyH.setNextHandler(tailH);//调用职责链的链头来完成操作 headH.HandlerCar();System.out.println("------------------------------");//顺序改变,希望是车身->车头->车尾 bodyH.setNextHandler(headH);headH.setNextHandler(tailH);bodyH.HandlerCar();System.out.println("--------------------------------------");//简便操作 bodyH.setNextHandler(headH).setNextHandler(tailH);bodyH.HandlerCar();} }