zoukankan      html  css  js  c++  java
  • 【设计模式

    1、模式简介

    责任链模式的简介:

    • 责任链模式为请求创建了一个接收者对象的链,每个接收者都包含对另一个接收者的引用,如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。
    • 责任链模式避免了请求的发送者和接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
    • 责任链上的处理者负责处理请求,客户只需要将请求发送到责任链上即可,无需关心请求的处理细节和请求的传递,所以责任链模式将请求的发送者和接收者解耦了。

    责任链模式的优点:

    • 降低耦合度。它将请求的发送者和接收者解耦;
    • 简化了对象。使得对象不需要知道链的结构;
    • 增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任;
    • 增加新的请求处理类很方便。

    责任链模式的缺点:

    • 不能保证请求一定被接收;
    • 系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用;
    • 可能不容易观察运行时的特征,有碍于除错。

    责任链模式的适用场景:

    • 有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定;
    • 在不明确指定接收者的情况下,向多个对象中的某一个对象提交一个请求;
    • 可动态指定一组对象的处理请求。

    2、案例

      在这个例子中,我们定义了一个责任链,其中有三个节点,分别是ConcreteHandler1、ConcreteHandler2和ConcreteHandler3。每个节点都是先判断传过来的消息是否是自己能够解决的,如果是则解决,否则继续传递给下一个节点处理。代码如下:

      责任处理节点的抽象父类Handler的代码:

    public abstract class Handler {
        protected Handler nextHandler; // 下一个责任链成员
    
        public Handler getNextHandler() {
            return nextHandler;
        }
    
        public void setNextHandler(Handler nextHandler) {
            this.nextHandler = nextHandler;
        }
    
        // 处理传递过来的时间
        public abstract void handleMessage(int type);
    }

      第一个责任处理节点ConcreteHandler1中的代码:

    public class ConcreteHandler1 extends Handler {
    
        @Override
        public void handleMessage(int type) {
            if (type == 1 || type == 3) {
                System.out.println("ConcreteHandler1解决了问题!");
            } else {
                System.out.println("ConcreteHandler1解决不了问题......");
                if (nextHandler != null) {
                    nextHandler.handleMessage(type);
                } else {
                    System.out.println("没有人能处理这个消息");
                }
            }
        }
    }

      第二个和第三个责任处理节点中的代码和第一个的代码大同小异,这里就不贴了,有需要的可以通过博客最下方的GitHub地址去GitHub中下载代码。

      测试类Test中的代码如下:

    public class Test {
        public static void main(String[] args) {
            // 初始化责任链:handler1 -> handler2 -> handler3
            Handler handler1 = new ConcreteHandler1();
            Handler handler2 = new ConcreteHandler2();
            Handler handler3 = new ConcreteHandler3();
            handler2.setNextHandler(handler3);
            handler1.setNextHandler(handler2);
            // 处理事件
            System.out.println("--------------Message1");
            handler1.handleMessage(1);
            System.out.println("--------------Message2");
            handler1.handleMessage(2);
            System.out.println("--------------Message3");
            handler1.handleMessage(4);
            System.out.println("--------------Message4");
            handler1.handleMessage(7);
        }
    }

      运行结果如下图所示:



      最后贴出责任链模式的GitHub代码地址:【GitHub - Chain Of Responsibility】

  • 相关阅读:
    在windows安装部署ShardingSphere-Proxy 分库分表中间件
    报错:fatal: unable to access 'https://github.com/xxx/': OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443
    一台Windows配置多个mysql服务
    解决.net core 部署IIS报错:HTTP Error 500.30
    vs code 不格式化注释
    .net工具类——URL请求数据
    .net工具类——URL处理
    .net工具类——读取写入cookie
    js没有权限
    ueditor图片上传
  • 原文地址:https://www.cnblogs.com/itgungnir/p/6211145.html
Copyright © 2011-2022 走看看