• 责任链模式【java版】


    应用场景:图形用户界面中,各个控件构成树状拓扑结构.在做消息机制时,子控件无

                法处理的消息,就继续传递给父控件来处理.


    特点: a)责任链模式并不指定链的拓扑结构,可以是单链表,二叉树,环
             b)链接顺序由系统任意指定,甚至可以进行动态变化

    一、组成结构

        请求者类:     

    public class Request {//请求者类,用flag标识
    private int levelFlag;

    public Request(int levelFlag) {
    this.levelFlag=levelFlag;
    }

    public int getLevelFlag() {
    return levelFlag;
    }

    public void setLevelFlag(int levelFlag) {
    this.levelFlag = levelFlag;
    }
    }

        处理者抽象类:

    public abstract class AbstractHandler {
    private AbstractHandler nextHandler=null;
    private int levelFlag;

    public void AbstractHandler(int levelFlag){
    this.levelFlag=levelFlag;
    }

    //通用的供外部直接调用的接口方法
    public final void handleRequest(Request request){
    if(this.levelFlag==request.getLevelFlag()){
    this.concreteHandle(request);
    }else{//当前处理者无法处理
    if(this.nextHandler!=null){//有下一个处理者
    System.out.println("当前处理者无法处理,请求传递给下一个处理者");
    this.nextHandler.handleRequest(request);
    }else{//没有下一个处理者
    System.out.println("职责链上的所有处理者都不能处理该请求...");
    }
    }
    }

    // 设置责任链中的下一个处理者
    protected void setNextHandler(AbstractHandler nextHandler) {
    this.nextHandler = nextHandler;
    }

    // 定义链中每个处理者具体的处理方式 ,该抽象方法由每个责任者具体实现
    protected abstract void concreteHandle(Request request);

    }

        处理者具体类一:

    //主要任务:定义具体的处理方式
    public class FirstConcreteHandler extends AbstractHandler {

    public FirstConcreteHandler(int levelFlag) {
    super.AbstractHandler(levelFlag);
    }

    @Override
    protected void concreteHandle(Request request) {
    System.out.println("当前为第一个处理者,可处理该请求,请求级别为:"+request.getLevelFlag());

    }

    }

        处理者具体类二:

    //主要任务:定义具体的处理方式
    public class SecondConcreteHandler extends AbstractHandler {

    public SecondConcreteHandler(int levelFlag) {
    super.AbstractHandler(levelFlag);
    }

    @Override
    protected void concreteHandle(Request request) {
    System.out.println("当前为第二个处理者,可处理该请求,请求级别为:"+request.getLevelFlag());

    }

    }

        处理者具体类三:

    //主要任务:定义具体的处理方式
    public class ThirdConcreteHandler extends AbstractHandler {

    public ThirdConcreteHandler(int levelFlag) {
    super.AbstractHandler(levelFlag);
    }

    @Override
    protected void concreteHandle(Request request) {
    System.out.println("当前为第三个处理者,可处理该请求,请求级别为:"+request.getLevelFlag());

    }

    }


    二、测试

           测试代码:

    public class Main {

    public static void main(String[] args) {
    System.out.println("开始测试责任链模式。。。");

    //定义两个请求实例
    Request request03=new Request(3);
    Request request08=new Request(8);

    //定义三个具体的处理者实例
    AbstractHandler firstConcreteHandler=new FirstConcreteHandler(1);
    AbstractHandler secondConcreteHandler=new SecondConcreteHandler(2);
    AbstractHandler thirdConcreteHandler=new ThirdConcreteHandler(3);

    //构建责任链
    firstConcreteHandler.setNextHandler(secondConcreteHandler);
    secondConcreteHandler.setNextHandler(thirdConcreteHandler);

    //每次请求都从责任链链头开始遍历
    firstConcreteHandler.handleRequest(request03);
    System.out.println();
    firstConcreteHandler.handleRequest(request08);
    System.out.println();

    }

    }

           运行结果:

     三、责任链模式与命令模式的区别
           责任链模式:无需事先约定,服务器端可以对客户端的请求一个一个进行试验
           命令模式:需要事先约定,服务器端根据约定执行客户端的相应请求,如:1代表start,2

                       代表move,这些都封装在Request中.

  • 相关阅读:
    如何配置docker的镜像源?
    ubuntu18.04下dns如何设置?
    ubuntu 18.04上执行buildman安装了交叉工具链之后编译报错"aarch64-linux/7.3.0/cc1: error while loading shared libraries: libmpfr.so.4: cannot open shared object file: No such file or directory"如何处理?
    iptables执行时报错"iptables : Couldn't load target `standard':No such file or directory"如何处理?
    Resharper 2019.1.1 破解
    Mac 使用笔记
    SpringBoot使用Nacos配置中心
    Springcloud gateway获取post请求内容
    scp命令详解
    Jdk8之lambda表达式的使用及流式算法
  • 原文地址:https://www.cnblogs.com/edisonfeng/p/2302837.html
Copyright © 2020-2023  润新知