zoukankan      html  css  js  c++  java
  • 北风设计模式课程---22、责任链模式

    北风设计模式课程---22、责任链模式

    一、总结

    一句话总结:

    设置了级别的场景:责任链适合那些已经设置了级别的场景,
    都有对应的抽象类:面向对象这些设计模式,处理类或者工厂类都有对应的抽象类,比如这里责任链模式的 处理类的抽象父类,作用自然是满足 开闭原则。

    1、责任链模式代码如何实现?

    |||-begin

    package com.ibeifeng.ex2;
    
    public abstract class CarHandler {
        protected CarHandler carHandler;
        
        public CarHandler setNextHandler(CarHandler carHandler) {
            this.carHandler = carHandler;
            return this.carHandler;
        }
        
        public abstract void HandlerCar(); 
    }

    |||-end

    1、知道下一级别对象:类之间链成了一条线,每个类知道下一个级别的对象,便于通知下一个级别
    2、抽象类中指定:直接在抽象类中指定下一级,就不需要分别在每个类中去设计了

    2、责任链模式如何在外部灵活的指定执行顺序?

    |||-begin

    1、处理类抽象类
    package com.ibeifeng.ex2;
    
    public abstract class CarHandler {
        protected CarHandler carHandler;
        
        public CarHandler setNextHandler(CarHandler carHandler) {
            this.carHandler = carHandler;
            return this.carHandler;
        }
        
        public abstract void HandlerCar(); 
    }
    
    2、处理类具体类:比如车头处理类 package com.ibeifeng.ex2; public class CarHeadHandler extends CarHandler{ public void HandlerCar() { System.out.println("组装车头"); if(this.carHandler != null) { this.carHandler.HandlerCar(); } } }

    /3、客户端实现 //顺序改变,希望是车身-->车头--车尾 bodyH.setNextHandler(headH); headH.setNextHandler(tailH); bodyH.HandlerCar();

    |||-end

    执行抽象类中的setNextHandler方法:这个方法用于接收下一级的对象,有了对象,自然很方便的执行这个方法

    3、责任链模式如何 链式执行?

    |||-begin

    处理类抽象类
    package com.ibeifeng.ex2;
    
    public abstract class CarHandler {
        protected CarHandler carHandler;
        
        public CarHandler setNextHandler(CarHandler carHandler) {
            this.carHandler = carHandler;
            return this.carHandler;
        }
        
        public abstract void HandlerCar(); 
    }
    
    客户端链式实现
    //简便操作 bodyH.setNextHandler(headH).setNextHandler(tailH); bodyH.HandlerCar();

    |||-end

    链式执行核心操作是抽象类中setNextHandler方法返回下一级对象:return this.carHandler;

    4、责任链模式的好处是什么?

    1、解决这种级别问题
    2、可以灵活指定用户是否知道内部的执行流程:用户可以无需管内部如何执行,要是用户知道 类之间的执行流程,用户也可以直接指定

    5、用户 无需管内部如何执行的 设计模式有哪些?

    责任链模式(也可以设置为控制内部的执行顺序)、外观模式

    6、什么是职责链模式?

    类的对象之间像链条一样紧密相连


       Chain of Responsibility(CoR)模式也叫职
    责链模式或者职责连锁模式,是行为模式之一,
    该模式构造一系列分别担当不同的职责的类的对
    象来共同完成一个任务,这些类的对象之间像链
    条一样紧密相连,所以被称作职责链模式

    7、职责链模式的应用场景?

    例1:比如客户Client要完成一个任务,这个任务包括a,b,c,d四个部分。首先客户Client把任务交给A,A完成a部分之后,把任务交给B,B完成b部分,...,直到D完成d部分。
    例2:比如政府部分的某项工作,县政府先完成自己能处理的部分,不能处理的部分交给省政府,省政府再完成自己职责范围内的部分,不能处理的部分交给中央政府,中央政府最后完成该项工作。
    例3:软件窗口的消息传播。
    例4:SERVLET容器的过滤器(Filter)框架实现。

    8、职责链模式的基本条件?

    1,对象链的组织:需要将某任务的所有职责执行对象以链的形式加以组织。
    2,消息或请求的传递:将消息或请求沿着对象链传递,以让处于对象链中的对象得到处理机会。
    3,处于对象链中的对象的职责分配:不同的对象完成不同的职责。
    4,任务的完成:处于对象链的末尾的对象结束任务并停止消息或请求的继续传递。

    要实现Chain of Responsibility模式,需要满足该模式的基本条件:
    1,对象链的组织。需要将某任务的所有职责执行对象以链的形式加以组织。
    2,消息或请求的传递。将消息或请求沿着对象链传递,以让处于对象链中的对象得到处理机会。
    3,处于对象链中的对象的职责分配。不同的对象完成不同的职责。
    4,任务的完成。处于对象链的末尾的对象结束任务并停止消息或请求的继续传递。

    9、职责链模式的优缺点?

    优点1:责任的分担:每个类只需要处理自己该处理的工作(不该处理的传递给下一个对象完成),明确各类的责任范围,符合类的最小封装原则。
    优点2:自由组合工作流程:可以根据需要自由组合工作流程。如工作流程发生变化,可以通过重新分配对象链便可适应新的工作流程。
    优点3:松耦合:类与类之间可以以松耦合的形式加以组织。
    缺点1:处理速度:因为处理时以链的形式在对象间传递消息,根据实现方式不同,有可能会影响处理的速度。

    10、职责链模式的角色和职责?

    Handler:处理类的抽象父类。:CarHandler.java
    concreteHandler:具体的处理类。:CarHeadHandler.java;CarBodyHandler.java;CarTailHandler.java

    二、内容在总结中

    1、相关知识

    Handler:处理类的抽象父类。:CarHandler.java
    concreteHandler:具体的处理类。:CarHeadHandler.java;CarBodyHandler.java;CarTailHandler.java

    2、代码

    Handler:处理类的抽象父类。:CarHandler.java

    package com.ibeifeng.ex2;
    
    public abstract class CarHandler {
        protected CarHandler carHandler;
        
        public CarHandler setNextHandler(CarHandler carHandler) {
            this.carHandler = carHandler;
            return this.carHandler;
        }
        
        public abstract void HandlerCar(); 
    }


    concreteHandler:具体的处理类。:CarHeadHandler.java;CarBodyHandler.java;CarTailHandler.java

    CarHeadHandler.java;

    package com.ibeifeng.ex2;
    
    public class CarHeadHandler extends CarHandler{
    
        public void HandlerCar() {
            System.out.println("组装车头");
            if(this.carHandler != null) {
                this.carHandler.HandlerCar();
            }
        }
    
    }

    CarBodyHandler.java;

    package com.ibeifeng.ex2;
    
    public class CarBodyHandler extends CarHandler {
    
        public void HandlerCar() {
            System.out.println("ΧιΧ°³΅Ιν");
            if(this.carHandler != null) {
                this.carHandler.HandlerCar();
            }
        }
    
    }

    CarTailHandler.java

    package com.ibeifeng.ex2;
    
    public class CarTailHandler extends CarHandler{
    
        public void HandlerCar() {
            System.out.println("ΧιΧ°³΅Ξ²");
            if(this.carHandler != null) {
                this.carHandler.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();
    
            //组装顺序预先设定好,顺序是车头-->车身-->车尾
            headH.setNextHandler(bodyH);
            bodyH.setNextHandler(tailH);
            
            //调用职责链的链头来完成操作
            headH.HandlerCar();
            
            System.out.println("---------------");
            
            //顺序改变,希望是车身-->车头--车尾
            bodyH.setNextHandler(headH);
            headH.setNextHandler(tailH);
            bodyH.HandlerCar();
            
            //简便操作
            bodyH.setNextHandler(headH).setNextHandler(tailH);
            bodyH.HandlerCar();
            
            
        }
    }
     
  • 相关阅读:
    软件测试相关面试
    GET和POST两种基本请求方法的区别
    Fiddler的安装与使用
    idea与eclipse项目相互导入的过程
    Selenium 学习笔记
    面试相关的案例
    idea编译启动报错
    window安装redis无法启动报错
    【001】接口测试-常用工具介绍和使用
    pyinstaller 打包exe相关
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/11073316.html
Copyright © 2011-2022 走看看