zoukankan      html  css  js  c++  java
  • 设计模式之职责链模式

    概念

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

    优点

      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();
         }
    }
  • 相关阅读:
    DIY 作品 及 维修 不定时更新
    置顶,博客中所有源码 github
    openwrt PandoraBox PBR-M1 极路由4 HC5962 更新固件
    使用 squid 共享 虚拟专用网至局域网
    第一次参加日语能力测试 N5
    libx264 libfdk_aac 编码 解码 详解
    开发RTSP 直播软件 H264 AAC 编码 live555 ffmpeg
    MFC Camera 摄像头预览 拍照
    http2 技术整理 nginx 搭建 http2 wireshark 抓包分析 server push 服务端推送
    plist 图集 php 批量提取 PS 一个个切
  • 原文地址:https://www.cnblogs.com/htyj/p/7326053.html
Copyright © 2011-2022 走看看