码迷,mamicode.com
首页 > 其他好文 > 详细

第十九讲:职责链模式

时间:2017-04-22 12:52:19      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:模式   执行   职责链   处理   over   tail   节点   out   方式   

技术分享

技术分享

技术分享

技术分享

技术分享


 

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

 

第十九讲:职责链模式

标签:模式   执行   职责链   处理   over   tail   节点   out   方式   

原文地址:http://www.cnblogs.com/ZHONGZHENHUA/p/6746879.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!