zoukankan      html  css  js  c++  java
  • 责任链模式【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中.

  • 相关阅读:
    2021-04-02:给定一个正方形或者长方形矩阵matrix,实现zigzag打印。[[0,1,2],[3,4,5],[6,7,8]]的打印顺序是0,1,3,6,4,2,5,7,8。
    2021-04-01:给定一个正方形矩阵matrix,原地调整成顺时针90度转动的样子。[[a,b,c],[d,e,f],[g,h,i]]变成[[g,d,a],[h,e,b],[i,f,c]]。
    2021-03-31:给定一个数组arr,给定一个值v。求子数组平均值小于等于v的最长子数组长度。
    2021-03-30:给定一个整数组成的无序数组arr,值可能正、可能负、可能0。给定一个整数值K,找到arr的所有子数组里,哪个子数组的累加和<=K,并且是长度最大的。返回其长度。
    2021-03-29:无序数组arr,子数组-1和1的数量一样多,请问最长子数组的长度是多少?
    04Null和Undefined
    03数据类型
    win10 命令行下 重启虚拟网卡
    JavaScript注释及命名规范
    第一个javascrpt代码
  • 原文地址:https://www.cnblogs.com/edisonfeng/p/2302837.html
Copyright © 2011-2022 走看看