北风设计模式课程---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();
        
        
    }
}
 
原文地址:https://www.cnblogs.com/Renyi-Fan/p/11073316.html