首页 > 代码库 > 第十九讲:职责链模式

第十九讲:职责链模式

技术分享

技术分享

技术分享

技术分享

技术分享


 

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();
        
    }
} 

 

第十九讲:职责链模式