面向对象设计模式:行为模式之责任链模式
创始人
2024-05-29 06:29:11
0

一、Backgroud 背景

在这里插入图片描述

  • 什么是推卸责任?
    • 坏的方面:去办事,被不同部门踢皮球
    • 好的方面:当外部请求程序进行某个处理,但程序暂时无法直接决定由哪个对象负责处理时,就需要推卸责任。我们可以将多个对象组成一个职责链,然后按照它们在职责链上的顺序一个一个地找出谁来负责处理
  • 责任链模式:对于一个请求,能自己做就自己做,做不了就推卸给下一个人;下一个人能自己做就自己做,不能做再推卸给下一个人。
  • 优点:
    • Decouple the sender of a request from its receiver. 解耦请求的发送方及其接收方。
  • 缺点:
    • Latency. 延迟

二、责任链模式,Chain of Responsibility Pattern

When a client issues a request, the request propagates (传播) along the chain until a ConcreteHandler object takes responsibility for handling it.
当客户端发出请求时,请求沿链传播(传播),直到某个 ConcreteHandler 对象负责处理它。

2.1 Intent 意图

  • Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. 通过为多个对象提供处理(同一)请求的机会的方式避免将请求的发送方与其接收方耦合:客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,故而解耦。
  • Chain the receiving objects and pass the request along the chain until an object handles it. 链接接收对象并沿链传递请求直到某一个对象处理这个请求。

2.2 Applicability 适用情况

  • More than one object may handle a request, and the handler isn’t known a priori(多个对象可以处理一个请求,并且处理程序先验已知的). The handler should be ascertained automatically(处理程序应自动确定)
  • Want to issue a request to one of several objects without specifying the receiver explicitly(想要在不显式指定接收方的情况下向多个对象之一发出请求).
  • The set of objects that can handle a request should be specified dynamically(应动态指定可以处理请求的对象集).

2.3 类图

在这里插入图片描述

  • Handler
    • Defines an interface for handling requests.
    • (Optional) Implements the successor(后继者) link.
  • ConcreteHandler
    • Handles requests it is responsible for. q can access its successor. q If the ConcreteHandler can handle the request, it does so; otherwise it forwards the request to its successor.
  • Client
    • Initiates the request to a ConcreteHandler object on the chain.

2.4 责任链模式 Code

  • Support:问题支持抽象类
public abstract class Support {private String name;                    // 解决问题的实例的名字private Support next;                   // 要推卸给的对象public Support(String name) {           // 生成解决问题的实例this.name = name;}public Support setNext(Support next) {  // 设置要推卸给的对象this.next = next;return next;}public void support(Trouble trouble) {for (Support obj = this; true; obj = obj.next) {if (obj.resolve(trouble)) {obj.done(trouble);break;} else if (obj.next == null) {obj.fail(trouble);break;}}}public String toString() {              // 显示字符串return "[" + name + "]";}protected abstract boolean resolve(Trouble trouble); // 解决问题的方法protected void done(Trouble trouble) {  // 解决System.out.println(trouble + " is resolved by " + this + ".");}protected void fail(Trouble trouble) {  // 未解决System.out.println(trouble + " cannot be resolved.");}
}
  • NoSupport
public class NoSupport extends Support {public NoSupport(String name) {super(name);}protected boolean resolve(Trouble trouble) {     // 解决问题的方法return false; // 自己什么也不处理}
}
  • OddSupport
public class OddSupport extends Support {public OddSupport(String name) {                // 构造函数super(name);}protected boolean resolve(Trouble trouble) {    // 解决问题的方法if (trouble.getNumber() % 2 == 1) {return true;} else {return false;}}
}
  • SpecialSupport
public class SpecialSupport extends Support {private int number;                                 // 只能解决指定编号的问题public SpecialSupport(String name, int number) {    // 构造函数super(name);this.number = number;}protected boolean resolve(Trouble trouble) {        // 解决问题的方法if (trouble.getNumber() == number) {return true;} else {return false;}}
}
  • LimitSupport
public class LimitSupport extends Support {private int limit;                              // 可以解决编号小于limit的问题public LimitSupport(String name, int limit) {   // 构造函数super(name);this.limit = limit;}protected boolean resolve(Trouble trouble) {    // 解决问题的方法if (trouble.getNumber() < limit) {return true;} else {return false;}}
}

  • Trouble
public class Trouble {private int number;             // 问题编号public Trouble(int number) {    // 生成问题this.number = number;}public int getNumber() {        // 获取问题编号return number;}public String toString() {      // 代表问题的字符串return "[Trouble " + number + "]";}
}

  • Main
public class Main {public static void main(String[] args) {Support alice   = new NoSupport("Alice_NoSupport");Support bob     = new LimitSupport("Bob_LimitSupport", 100); //只能处理100以下的数Support charlie = new SpecialSupport("Charlie_SpecialSupport", 429); //只能处理429这一个数Support diana   = new LimitSupport("Diana_LimitSupport", 200); //只能处理200以下的数Support elmo    = new OddSupport("Elmo_OddSupport"); //只能处理奇数Support fred    = new LimitSupport("Fred_LimitSupport", 300); //只能处理三百以下的数// 形成职责链alice.setNext(bob).setNext(charlie).setNext(diana).setNext(elmo).setNext(fred);// 制造各种问题for (int i = 0; i < 500; i += 33) {alice.support(new Trouble(i));}}
}

2.4 责任链模式优缺点

  • 优点
    • 降低耦合度
    • 简化了对象,使得对象不需要知道链的结构
    • 增强给对象指派职责的灵活性:通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任
  • 缺点
    • 不能保证请求一定被接收
    • 系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用

相关内容

热门资讯

黄岩石窟三年级作文(实用3篇... 黄岩石窟三年级作文 篇一探秘黄岩石窟我家住在浙江省的黄岩市,最近我们班组织了一次参观黄岩石窟的活动。...
假如我会变三年级450字作文... 假如我会变三年级450字作文 篇一如果我能变成三年级的学生,我会怎么样呢?首先,我会更加努力学习,争...
可恶的小老鼠三年级作文【精简... 可恶的小老鼠三年级作文 篇一最近我们班的教室里出现了一个可恶的小老鼠。这只小老鼠总是在我们不注意的时...
三年级作文200个子18篇【... 篇一:我的暑假计划暑假即将来临,我早早地制定了一个丰富多彩的暑假计划。首先,我计划读很多好书。我喜欢...
小学三年级作文400字【实用... 小学三年级作文400字 篇一爱护小动物我家附近有一个小公园,里面有很多小动物。我喜欢去那里看它们,但...
三年级科幻作文智能干家务的机... 三年级科幻作文智能干家务的机器人 篇一智能家务机器人的出现在未来的世界里,科技发展迅速,人们的生活变...
三年级下册我做了一项小实验作... 三年级下册我做了一项小实验作文 篇一标题:探究种子发芽的条件在三年级下册的科学课上,我们进行了一项小...
三年级学生感受作文(优选6篇... 三年级学生感受作文 篇一我喜欢上学的理由我是一个三年级的学生,我非常喜欢上学。每天早上,当妈妈叫我起...
小学三年级说好普通话作文(优... 小学三年级说好普通话作文 篇一我要当一个好学生我是一个小学三年级的学生,我知道要成为一个好学生,首先...
三年级的黄果树瀑布的作文怎么... 篇一:三年级的黄果树瀑布之旅黄果树瀑布是中国贵州省的一处自然景观,也是我国最大的瀑布之一。作为一个三...
三年级作文抓鱼趣事21篇【最... 三年级作文抓鱼趣事21篇 篇一:我和小伙伴们的抓鱼经历在一个阳光明媚的周末,我和几个小伙伴决定去河边...
三年级作文:踢足球(精简6篇... 三年级作文:踢足球 篇一踢足球是我最喜欢的运动之一。我每天放学后都会和朋友们一起来到学校的操场上踢球...
写快乐的一件事三年级的作文3... 篇一:快乐的一件事在我三年级的时候,有一次我和妈妈一起去公园玩,那是一个阳光明媚的周末早上。我们带了...
秦皇岛黄金海岸游记三年级作文... 秦皇岛黄金海岸游记三年级作文 篇一我和家人去了秦皇岛黄金海岸度假,这是我人生中最美好的一次旅行。黄金...
一次旅行的经历作文三年级作文... 一次旅行的经历作文三年级作文 篇一我最难忘的一次旅行是和爸爸妈妈去海边玩的那次。那是一个阳光明媚的早...
三年级看图写作文借伞【优质6... 三年级看图写作文借伞 篇一今天,我们班级进行了一次有趣的活动,每个同学都被要求写一篇关于“借伞”的作...
三年级上册语文句子复习(优质... 三年级上册语文句子复习 篇一在三年级上册的语文学习中,我们学习了许多句子,现在让我们来进行一次复习吧...
三年级作文这一次我被感动了4... 篇一:三年级作文这一次我被感动了43篇这一次我被感动了43篇作文,这是我在三年级最难忘的一次经历。这...
木鱼岛小学三年级作文300字... 木鱼岛小学三年级作文300字 篇一我的梦想我是木鱼岛小学三年级的学生,我的名字叫小明。我有一个美丽的...
三年级的海边作文200字【精... 三年级的海边作文200字 篇一我在海边玩耍今天是个晴朗的日子,我和爸爸妈妈一起去海边玩耍。海边的沙滩...