public class CarBodyHandler extends CarHandler{ @Override public void HandlerCar() { // TODO Auto-generated method stub System.out.println("组装车身"); } }
public abstract class CarHandler { public abstract void HandlerCar(); }
public class CarHeadHandler extends CarHandler{ @Override public void HandlerCar() { // TODO Auto-generated method stub System.out.println("组装车头"); } }
public class CarTailHandler extends CarHandler{ @Override public void HandlerCar() { // TODO Auto-generated method stub System.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{ @Override public void HandlerCar() { // TODO Auto-generated method stub System.out.println("组装车身"); if(this.carHandler!=null){ this.carHandler.HandlerCar(); } } }
package com.ibeifeng.ex2; public class CarHeadHandler extends CarHandler{ @Override public void HandlerCar() { // TODO Auto-generated method stub System.out.println("组装车头"); if(this.carHandler!=null){ this.carHandler.HandlerCar(); } } }
package com.ibeifeng.ex2; public class CarTailHandler extends CarHandler{ @Override public void HandlerCar() { // TODO Auto-generated method stub System.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(); } }