前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java责任链模式

java责任链模式

作者头像
码农王同学
发布2020-03-25 11:40:56
3680
发布2020-03-25 11:40:56
举报
文章被收录于专栏:后端Coder

我们先看下责任链模式概念,百度百科。

代码语言:javascript
复制
责任链模式是一种设计模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。
请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理
这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。

首先我们先定义一个抽象类处理器作为整条链的开始节点。

代码语言:javascript
复制
package com.wpw.iteratorpro;

/**
 * @author pc
 */
public abstract class Handler {
    protected  Handler next;

    public Handler getNext() {
        return next;
    }

    public void setNext(Handler next) {
        this.next = next;
    }
    public abstract void handleRequest(int request);
}

这个地方包含下一个处理器节点的引用。

代码语言:javascript
复制
package com.wpw.iteratorpro;

public class Ahander extends Handler {
    @Override
    public void handleRequest(int request) {
        if (request<=3){
            System.out.println("A ok");
        }else{
            if (next!=null){
                getNext().handleRequest(request);
            }
        }
    }
}
代码语言:javascript
复制
package com.wpw.iteratorpro;

import java.util.Objects;

public class Bhandler extends Handler {
    @Override
    public void handleRequest(int request) {
        if (request<=5){
            System.out.println("B ok");
        }else{
            if (Objects.nonNull(next)){
                getNext().handleRequest(request);
            }
        }
    }
}
代码语言:javascript
复制
package com.wpw.iteratorpro;

import java.util.Objects;

public class Chandler extends Handler {
    private static final Integer LEVEL_MIN_NUM = 7;
    private static final Integer LEVEL_MAX_NUM = 10;

    @Override
    public void handleRequest(int request) {
        if (LEVEL_MIN_NUM <= request && request <= LEVEL_MAX_NUM) {
            System.out.println("C ok");
        } else {
            if (Objects.nonNull(next)) {
                getNext().handleRequest(request);
            }
        }
    }
}
代码语言:javascript
复制
package com.wpw.iteratorpro;

public class  DHandler extends Handler {
    @Override
    public void handleRequest(int request) {
        System.out.println("D ok");
    }
}

定义几个具体的处理器继承自抽象类,每个处理器按照自己的职责处理自己的事情,下面我们写个测试程序进行测试一下。

代码语言:javascript
复制
package com.wpw.iteratorpro;

/**
 * @author pc
 */
public class TestHandler {
    public static void main(String[] args) {
        Handler Handler=new Ahander();
        Handler BHandler=new Bhandler();
        Handler  CHandler=new Chandler();
        Handler DHandler=new DHandler();
        Handler.setNext(BHandler);
        BHandler.setNext(CHandler);
        CHandler.setNext(DHandler);
        Handler.handleRequest(3);
    }
}

控制台输出的内容信息为:

代码语言:javascript
复制
/*
* 提示:该行代码过长,系统自动注释不进行高亮。一键复制会移除系统注释 
* "C:\Program Files\Java\jdk1.8.0_25\bin\java.exe" -Dvisualvm.id=236432961659800 "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.1.2\lib\idea_rt.jar=11487:C:\Program Files\JetBrains\IntelliJ IDEA 2019.1.2\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_25\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\rt.jar;D:\iterator-pro\target\classes;C:\Users\pc\workspace\repository\repository\org\springframework\boot\spring-boot-starter-web\2.2.4.RELEASE\spring-boot-starter-web-2.2.4.RELEASE.jar;C:\Users\pc\workspace\repository\repository\org\springframework\boot\spring-boot-starter\2.2.4.RELEASE\spring-boot-starter-2.2.4.RELEASE.jar;C:\Users\pc\workspace\repository\repository\org\springframework\boot\spring-boot\2.2.4.RELEASE\spring-boot-2.2.4.RELEASE.jar;C:\Users\pc\workspace\repository\repository\org\springframework\boot\spring-boot-autoconfigure\2.2.4.RELEASE\spring-boot-autoconfigure-2.2.4.RELEASE.jar;C:\Users\pc\workspace\repository\repository\org\springframework\boot\spring-boot-starter-logging\2.2.4.RELEASE\spring-boot-starter-logging-2.2.4.RELEASE.jar;C:\Users\pc\workspace\repository\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;C:\Users\pc\workspace\repository\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;C:\Users\pc\workspace\repository\repository\org\apache\logging\log4j\log4j-to-slf4j\2.12.1\log4j-to-slf4j-2.12.1.jar;C:\Users\pc\workspace\repository\repository\org\apache\logging\log4j\log4j-api\2.12.1\log4j-api-2.12.1.jar;C:\Users\pc\workspace\repository\repository\org\slf4j\jul-to-slf4j\1.7.30\jul-to-slf4j-1.7.30.jar;C:\Users\pc\workspace\repository\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;C:\Users\pc\workspace\repository\repository\org\yaml\snakeyaml\1.25\snakeyaml-1.25.jar;C:\Users\pc\workspace\repository\repository\org\springframework\boot\spring-boot-starter-json\2.2.4.RELEASE\spring-boot-starter-json-2.2.4.RELEASE.jar;C:\Users\pc\workspace\repository\repository\com\fasterxml\jackson\core\jackson-databind\2.10.2\jackson-databind-2.10.2.jar;C:\Users\pc\workspace\repository\repository\com\fasterxml\jackson\core\jackson-annotations\2.10.2\jackson-annotations-2.10.2.jar;C:\Users\pc\workspace\repository\repository\com\fasterxml\jackson\core\jackson-core\2.10.2\jackson-core-2.10.2.jar;C:\Users\pc\workspace\repository\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.10.2\jackson-datatype-jdk8-2.10.2.jar;C:\Users\pc\workspace\repository\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.10.2\jackson-datatype-jsr310-2.10.2.jar;C:\Users\pc\workspace\repository\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.10.2\jackson-module-parameter-names-2.10.2.jar;C:\Users\pc\workspace\repository\repository\org\springframework\boot\spring-boot-starter-tomcat\2.2.4.RELEASE\spring-boot-starter-tomcat-2.2.4.RELEASE.jar;C:\Users\pc\workspace\repository\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.30\tomcat-embed-core-9.0.30.jar;C:\Users\pc\workspace\repository\repository\org\apache\tomcat\embed\tomcat-embed-el\9.0.30\tomcat-embed-el-9.0.30.jar;C:\Users\pc\workspace\repository\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.30\tomcat-embed-websocket-9.0.30.jar;C:\Users\pc\workspace\repository\repository\org\springframework\boot\spring-boot-starter-validation\2.2.4.RELEASE\spring-boot-starter-validation-2.2.4.RELEASE.jar;C:\Users\pc\workspace\repository\repository\jakarta\validation\jakarta.validation-api\2.0.2\jakarta.validation-api-2.0.2.jar;C:\Users\pc\workspace\repository\repository\org\hibernate\validator\hibernate-validator\6.0.18.Final\hibernate-validator-6.0.18.Final.jar;C:\Users\pc\workspace\repository\repository\org\jboss\logging\jboss-logging\3.4.1.Final\jboss-logging-3.4.1.Final.jar;C:\Users\pc\workspace\repository\repository\com\fasterxml\classmate\1.5.1\classmate-1.5.1.jar;C:\Users\pc\workspace\repository\repository\org\springframework\spring-web\5.2.3.RELEASE\spring-web-5.2.3.RELEASE.jar;C:\Users\pc\workspace\repository\repository\org\springframework\spring-beans\5.2.3.RELEASE\spring-beans-5.2.3.RELEASE.jar;C:\Users\pc\workspace\repository\repository\org\springframework\spring-webmvc\5.2.3.RELEASE\spring-webmvc-5.2.3.RELEASE.jar;C:\Users\pc\workspace\repository\repository\org\springframework\spring-aop\5.2.3.RELEASE\spring-aop-5.2.3.RELEASE.jar;C:\Users\pc\workspace\repository\repository\org\springframework\spring-context\5.2.3.RELEASE\spring-context-5.2.3.RELEASE.jar;C:\Users\pc\workspace\repository\repository\org\springframework\spring-expression\5.2.3.RELEASE\spring-expression-5.2.3.RELEASE.jar;C:\Users\pc\workspace\repository\repository\org\slf4j\slf4j-api\1.7.30\slf4j-api-1.7.30.jar;C:\Users\pc\workspace\repository\repository\org\springframework\spring-core\5.2.3.RELEASE\spring-core-5.2.3.RELEASE.jar;C:\Users\pc\workspace\repository\repository\org\springframework\spring-jcl\5.2.3.RELEASE\spring-jcl-5.2.3.RELEASE.jar" com.wpw.iteratorpro.TestHandler
*/
A ok

Process finished with exit code 0

责任链模式的好处就是使请求者和处理者之间减少耦合,“高内聚,低耦合”的特性,责任链模式打个比方就是我们生活中,我们常见的自行车链上的一节一节的环,动态的增减链上的处理者。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-01-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农王同学 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档