网站首页 > 精选教程 正文
为了巩固跟复习22个设计模式,每天不定时发表一篇关于设计模式的文稿!今天写的是结构型模式中的“责任链模式(命令链、CoR、Chain of Command、Chain of Responsibility)”。
行为模式:责任链模式(命令链、CoR、Chain of Command、Chain of Responsibility)->
- 定义
责任链模式是一种行为设计模式, 允许你将请求沿着处理者链进行发送。 收到请求后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者。
- 责任链模式结构
- 处理者 (Handler) 声明了所有具体处理者的通用接口。 该接口通常仅包含单个方法用于请求处理, 但有时其还会包含一个设置链上下个处理者的方法。
- 基础处理者(Base Handler)是一个可选的类,你可以将所有处理者共同的样本代码放置在其中。通常情况下,该类定义了一个保存对于下个处理者的构造函数或设定方法来创建链。该类还可以实现默认的处理行为:确定下个处理者存在后再请求转给它。
- 具体处理者(Concrete Handlers)包含处理请求的实际代码。每个处理者接收到请求后,都必须决定是否进行处理,以及是否沿着链传递请求。处理者通常是独立且不可变的,需要通过构造函数一次性获得所有必要地的数据。
- 客户端(Client)可根据程序逻辑一次性或者动态的生成链。值得注意的是,请求可发送给链上的任意一个处理者,而非必须是第一个处理者。
- 适应场景
- 当程序需要使用不同方式处理不同种种类请求,而且请求类型和顺序预先未知时,可以使用责任链模式。
- 当必须按顺序执行多个处理者时,可以使用该模式。
- 如果所需处理者及其顺序必须在运行时进行改变,可以使用责任链模式。
- 实现方式
- 声明处理者接口并描述请求处理方法的签名。确定客户端如何将请求数据传递给方法。 最灵活的方式是将请求转换为对象, 然后将其以参数的形式传递给处理函数。
- 为了在具体处理者中消除重复的样本代码, 你可以根据处理者接口创建抽象处理者基类。该类需要有一个成员变量来存储指向链上下个处理者的引用。 你可以将其设置为不可变类。 但如果你打算在运行时对链进行改变, 则需要定义一个设定方法来修改引用成员变量的值。为了使用方便, 你还可以实现处理方法的默认行为。 如果还有剩余对象, 该方法会将请求传递给下个对象。 具体处理者还能够通过调用父对象的方法来使用这一行为。
- 依次创建具体处理者子类并实现其处理方法。 每个处理者在接收到请求后都必须做出两个决定:1)是否自行处理这个请求。2)是否将该请求沿着责任链进行传递。
- 客户端可以自行组装链, 或者从其他对象处获得预先组装好的链。 在后一种情况下, 你必须实现工厂类以根据配置或环境设置来创建链。
- 客户端可以触发链中的任意处理者, 而不仅仅是第一个。 请求将通过链进行传递, 直至某个处理者拒绝继续传递, 或者请求到达链尾。
- 由于链的动态性, 客户端需要准备好处理以下情况:1)链中可能只有单个链接。2)部分请求可能无法到达链尾。3)其他请求可能直到链尾都未被处理。
- 责任链模式优缺点
优点:1)你可以控制请求处理的顺序。
2)单一职责原则。你可以发起操作和执行操作的类进行解耦。
3)开闭原则。你可以在不更改现有代码的情况下载程序中新增处理者。
缺点:1)部分请求可能未被处理。
- 在Java中责任链模式的应用
* javax.servlet.Filter#doFilter()
* java.util.logging.Logger#log()
- 如何识别责任链模式
责任链模式可通过一组对象的行为方法间距调用其他对象的相同方法来识别,而且所有对象都会遵循相同的接口。
- 上一篇: Java责任链设计模式
- 下一篇: 设计模式系列—责任链模式
猜你喜欢
- 2024-12-02 面试官:项目中你是如何利用设计模式,干掉if-else的
- 2024-12-02 设计模式——职责链模式
- 2024-12-02 梳理原理,这一次就彻底了解OkHttp与Retrofit吧
- 2024-12-02 同事写了一个责任链模式,bug无数...
- 2024-12-02 设计模式之不一样的责任链模式
- 2024-12-02 如何在业务代码中优雅的使用责任链模式
- 2024-12-02 设计模式系列-行为型-责任链模式
- 2024-12-02 责任链模式(Chain of Responsibility Pattern)
- 2024-12-02 设计模式系列—责任链模式
- 2024-12-02 Java责任链设计模式
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)