首页 > 其他分享 >责任链模式

责任链模式

时间:2023-03-30 22:14:09浏览次数:32  
标签:param 责任 handler 参数 模式 successor public AbstractParamHandler

概述

《设计模式》一书中对于 “责任链模式” 的意图描述如下:

使多个对象有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止

一般的 UML 结构图如下所示:

reposibility_pattern_uml.png

其中,Handler 将会包含直接后继处理类 successor,用于处理后续的更通用请求

一般在以下情况下使用责任链模式:

  • 有多个对象可以处理一个请求,哪个对象处理请求由运行时进行确定
  • 在不想明确指定接受者的情况下,向多个对象中的一个提交一个请求
  • 可处理请求的对象集合应该被动态指定

具体示例

在某些情况下,可能需要对相关的请求参数进行相关的解析,得到在某个通用模块中需要用到的参数,然而,对于不同的请求参数,解析的方式也可能不同,因此我们可以通过使用责任链模式来解决这个问题。

假设我们现在的系统中存在以下的参数类型:

public interface UpdateParam { // 更新数据时的参数类型
    String updatedId();
}

public interface DeletedParam { // 删除数据时的参数类型
    String deletedId();
}

public interface InsertedParam { // 增加数据时的参数类型
    String insertedId();
}

在当前的上下文环境下,这三个接口返回的都是通用模块需要的参数,但是由于这三个参数的使用具体由不同的开发使用,现在已经很难对这几个参数类型进行 “提炼父类” 的重构。并且除了这三个参数类型之外,可能系统中还存在某些其它类型的参数,如 ListMap 等,对这些类型同样无法使用 “提炼父类” 的操作进行泛化处理。为了能够适配通用模块的需求,我们可以定义如下的处理类 Handler

public abstract class AbstractParamHandler {
    private final AbstractParamHandler successor;
    
    public AbstractParamHandler(AbstractParamHandler successor) {
        this.successor = successor;
    }
    
    protected String successorHandler(Object Param) {
        return this.successor == null ? null : this.successor.handler(param);
    }
    
    // 针对参数对象,对其进行解析以得到对应的通用参数值,如果无法解析,则返回 null
    public abstract String handler(Object param);
}

针对上面我们提到的三种参数类型,我们可以定义对应的参数处理类:

public class InsertedParamHandler extends AbstractParamHandler {
    
    public InsertedParamHandler(AbstractParamHandler successor) {
        super(successor);
    }
    
    @Override
    public String handler(Object param) {
        if (!(param instanceof InsertedParam)) {
             return successorHandler(param);
        }
        return ((InsertedParam) param).insertedId();
    }
}

public class UpdatedParamHandler extends AbstractParamHandler {
    public UpdatedParamHandler(AbstractParamHandler successor) {
        super(successor);
    }
    
    @Override
    public String handler(Object param) {
        if (!(param instanceof UpdatedParam)) {
            return successorHandler(param);
        }
        return ((UpdatedParam) param).updatedId();
    }
}

public class DeletedParamHandler extends AbstractParamHandler {
    public DeletedParamHandler(AbstractParamHandler successor) {
        super(successor);
    }
    
    @Override
    public String handler(Object param) {
        if (!(param instanceof DeletedParam)) {
            return successorHandler(param);
        }
        return ((DeletedParam) param).deletedId();
    }
}

对于客户端来讲,只要适当组织好这些处理类之间的关系即可:

public class Client {
    private AbstractParamHandler handler;
    public Client() {
        // 将这三个处理类组合成处理链
        InsertParamHandler h1 = new InsertParamHandler(null);
        UpdatedParamHandler h2 = new UpdatedParamHandler(h1);
        DeleteParamHandler h3 = new DeletedParamHandler(h2);
        this.handler = h3;
    }
    
    String handler(Object param) {
        return handler.handler(param);
    }
}

如果后续发现 List 类型的参数也需要解析,那么只需要再将 DeletedParamHandler 作为它的后继处理即可完成对所有类型的参数解析

总结

针对不同请求的特殊处理,通过责任连模式来选择合适的处理对象,一般这种模式会结合 “组合模式” 一起使用,可以合理的适配每个父组件的特殊处理



参考:

[1] 《设计模式—可复用面向对象基础》

标签:param,责任,handler,参数,模式,successor,public,AbstractParamHandler
From: https://www.cnblogs.com/FatalFlower/p/17274518.html

相关文章

  • 设计模式(三十)----综合应用-自定义Spring框架-自定义Spring IOC-定义bean、注册表相
    现要对下面的配置文件进行解析,并自定义Spring框架的IOC对涉及到的对象进行管理。<?xmlversion="1.0"encoding="UTF-8"?><beans>  <beanid="userService"class="com.itheima.service.impl.UserServiceImpl">    <propertyname=&qu......
  • IOS中KVO模式的解析与应用
    最近老翁在项目中多处用到了KVO,深感这种模式的好处。现总结如下:一、概述KVO,即:Key-ValueObserving,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。KVO其实也是“观察者”设计模......
  • (二十六)访问者模式
    1.概述访问者模式(Visitor),表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。2.示例Visitor类,为该对象结构中ConcreteElement的每一个类声明一个Visit操作。Visitor.javapublicabstractclassVisitor{......
  • 直线模组常用的驱动模式有哪些?
    直线模组是工业生产中经常用到的直线运动单元,其驱动方式有很多种,但常用的驱动方式通常有两种,一种是滚珠丝杆传动,另一种是同步带传动。滚珠丝杆传动方式的特点是重复定位精度较高,最高精度可达±0.005mm,并且负载一般也比较大,在工业生产中通常被应用于对精度有一定要求的生产过程中。......
  • 单用户模式进centos系统修改root密码
    为虚拟机server重设管理密码1)重启系统,进入recovery恢复模式在读秒时候按e键,找到linux16行,按键盘End末尾添加空格rd.breakconsole=tty0按ctrl+x启动2)......
  • 《无尽之剑2》重大更新 新增ClashMob社交模式
    备受关注的《无尽之剑2》ClashMob模式终于亮相了,已在AppStore上架。ClashMob是一种新游戏模式,这种模式可以多人合作,通过联网和其他玩家一起挑战一个超大型的BOSS。胜利者......
  • 基于stm32mp157 linux开发板ARM裸机开发教程3:Cortex-A7 架构与工作模式(连载中)
    前言:目前针对ARMCortex-A7裸机开发文档及视频进行了二次升级持续更新中,使其内容更加丰富,讲解更加细致,全文所使用的开发平台均为华清远见FS-MP1A开发板(STM32MP157开发板)针对......
  • golang并发编程-模式
    1.Generator9.Queuepackagemainimport("fmt""sync""time")constlimit=4constwork=100funcprocess(wg*sync.WaitGroup,workint,......
  • 前端设计模式——依赖注入模式
    依赖注入模式(DependencyInjectionPattern):允许我们通过将对象的依赖关系从代码中分离出来,从而使代码更加模块化和可重用。在传统的编程模式中,一个对象可能会直接创建或......
  • 行为型:观察者模式
    定义观察者模式属于行为型模式,它定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知,并自动更新。一种一对多的关系中一称为......