zoukankan      html  css  js  c++  java
  • 第十九讲:职责链模式


    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();
            
        }
    } 
  • 相关阅读:
    程序的局部性原理2
    程序的局部性原理
    ROM
    学习Spring Security OAuth认证(一)-授权码模式
    mybatis*中DefaultVFS的logger乱码问题
    maven生命周期绑定要点
    spring security antMatchers相关内容
    JSTL
    什么是CSS hack?
    Java中获得当前静态类的类名
  • 原文地址:https://www.cnblogs.com/ZHONGZHENHUA/p/6746879.html
Copyright © 2011-2022 走看看