• 设计模式之职责链模式


    概念

       职责链模式就是使多个对象都有机会处理请求,从而避免请求发送者和请求处理者之间的耦合。将这多个对象按着需求组合成一条链,使请求在这条链上进行传递,知道有一个对象处理了请求。

    优点

      1.客户提交的请求会沿着我们根据需求设置的链一直传递,直到有一个对象处理了它,并且我们可以根据需要随后的增加或者而修改链上的对象,而不影响每个对象本身的使用。

      2.请求发送者和请求接受者之间没有耦合,互相都没有对方的信息,且链中的对象本身也不清楚链的结构

      3.简化了的对象之间的相互连接,每个对象最多只保持一个后继者的引用,不用保持所有后继者的引用

    注意:1.我们设置的链一定要保证最终这个请求可以被处理 2.需要在每个对象中做出判断,判断什么条件下我可以处理或者什么条件下交给继任者(当然要判断时候有继任者)

    使用场景

       一个请求可能被传递给多个对象,直到某个对象处理完成结束,但是客户并不知道请求会被那个对象处理。

    代码示例

    //定义一个处理请求的接口
    public
    abstract class Handler { /** * 持有后继者的引用对象 */ protected Handler successor; /** * 处理请求的抽象方法 虽然这个示意方法是没有传入参数的 * 但实际是可以传入参数的,根据具体需要来选择是否传递参数 */ public abstract void handleRequest(); /** * 取值方法 */ public Handler getSuccessor() { return successor; } /** * 赋值方法,设置后继的责任对象 */ public void setSuccessor(Handler successor) { this.successor = successor; } }

    定义若干个具体处理者类

    public class ConcreteHandler1 extends Handler {
         /**
          * 处理方法,调用此方法处理请求
         */
         @Override
         public void handleRequest() {
             /**
              * 判断是否有后继的责任对象
             * 如果有,就转发请求给后继的责任对象
             * 如果没有,则处理请求
             */
             if(什么条件下能处理这个请求){           
            System.out.println("处理请求");
             }else if(successor!=null){
            System.out.println("放过请求");
                 successor.handleRequest(); 
            } 
    }
    }

    public class ConcreteHandler2 extends Handler {
         /**
          * 处理方法,调用此方法处理请求
         */
         @Override
         public void handleRequest() {
             /**
              * 判断是否有后继的责任对象
             * 如果有,就转发请求给后继的责任对象
             * 如果没有,则处理请求
             */
             if(什么条件下能处理这个请求){           
    
    
            System.out.println("处理请求");
    
    
             }else if(successor!=null){
    
    
            System.out.println("放过请求");
                 successor.handleRequest(); 
            } 
    }
    }
    ......

     客户端代码,向链上的具体处理者对象提交请求

    public class Client {
    
        public static void main(String[] args) {
             //组装责任链
            Handler handler1 = new ConcreteHandler1();
             Handler handler2 = new ConcreteHandler2();
             handler1.setSuccessor(handler2);
             //提交请求
            handler1.handleRequest();
         }
    }
  • 相关阅读:
    RabbitMQ
    连接池,为什么要使用连接池?
    mac 安装arcanist
    感触
    UDP socket
    Servlet过滤器
    PL、SQL
    springmvc 文件上传实现(不是服务器的)
    注解spring
    excel工具类
  • 原文地址:https://www.cnblogs.com/htyj/p/7326053.html
Copyright © 2020-2023  润新知