13-职责链模式

职责链模式

行为型模式

  • 行为型模式(Behavioral Pattern)关注系统中对象之间的交互,研究系统在运行时对象之间的相互通信与协作进一步明确对象的职责

  • 行为型模式:不仅仅关注类和对象本身,还重点关注它们之间的相互作用职责划分

image-20221213193005339

红绿灯(事件源)……?

行为型模式分类

类行为型模式
  • 使用继承关系在几个类之间分配行为,主要通过多态等方式来分配父类与子类的职责

对象行为型模式
  • 使用对象的关联关系来分配行为,主要通过对象关联等方式来分配两个或多个类的职责

image-20221213192943236

按钮(观察目标)

行为型模式一览表image-20221213193254191

中介者模式——QQ好友与群组之间错综复杂的关系

状态模式——自学

职责链模式

实例分析

奖学金审批示意图

image-20221213193735975

分析

  • 辅导员、系主任、院长、校长都可以处理奖学金申请表,他们构成一个处理申请表的链式结构,申请表沿着这条链进行传递,这条链就称为职责链

  • 职责链可以是一条直线、一个环或者一个树形结构最常见的职责链是直线型,即沿着一条单向的链来传递请求

纯职责链:在一个链式结构上只有一个对象能够执行处理处理之后不再往下传递

非纯职责链:在一个链式结构上可能存在一个对象处理之后发送到下一个对象进行处理……

职责链模式的定义

image-20221213194341042

对象行为型模式

标准职责链模式是纯职责链模式

  • 请求的处理者组织成一条链,并让请求沿着链传递,由链上的处理者对请求进行相应的处理

  • 客户端无须关心请求的处理细节以及请求的传递,只需将请求发送到链上,将请求的发送者和请求的处理者解耦

职责链模式结构

image-20221213194640323

处理流程:当前实体ConcreteHandler先判断是否能够处理,如果不能处理则转发给下一个ConcreteHandler

职责链模式包含以下2个角色:
  • Handler(抽象处理者)

  • ConcreteHandler(具体处理者)

典型的抽象处理者代码
1
2
3
4
5
6
7
8
9
10
public abstract class Handler {
//维持对下家的引用
protected Handler successor;

public void setSuccessor(Handler successor) {
this.successor=successor;
}

public abstract void handleRequest(String request);
}
典型的具体处理者代码
1
2
3
4
5
6
7
8
9
10
public class ConcreteHandler extends Handler {
public void handleRequest(String request) {
if (请求满足条件) {
//处理请求
}
else {
this.successor.handleRequest(request); //转发请求
}
}
}
典型的客户端代码
1
2
3
4
5
6
7
8
9
10
11
……
Handler handler1, handler2, handler3;
handler1 = new ConcreteHandlerA();
handler2 = new ConcreteHandlerB();
handler3 = new ConcreteHandlerC();
//创建职责链
handler1.setSuccessor(handler2);
handler2.setSuccessor(handler3);
//发送请求,请求对象通常为自定义类型
handler1.handleRequest("请求对象");
……
实例类图

image-20221213200557529

image-20221213200610437

image-20221213200617709

(1) PurchaseRequest:采购单类,充当请求类

(2) Approver:审批者类,充当抽象处理者

(3) Director:主任类,充当具体处理者

(4) VicePresident:副董事长类,充当具体处理者

(5) President:董事长类,充当具体处理者

(6) Congress:董事会类,充当具体处理者

(7) Client:客户端测试类

结果及分析
增加一个经理(Manager)角色
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//经理类:具体处理者
public class Manager extends Approver {
public Manager(String name) {
super(name);
}

//具体请求处理方法
public void processRequest(PurchaseRequest request) {
if (request.getAmount() < 80000) {
System.out.println("经理" + this.name + "审批采购单:" + request.getNumber() + ",金额:" + request.getAmount() + "元,采购目的:" + request.getPurpose() + "。"); //处理请求
}
else {
this.successor.processRequest(request); //转发请求
}
}
}
修改客户端代码
1
2
3
4
5
6
7
Approver rhuang;
rhuang = new Manager("黄蓉");
//创建职责链
wjzhang.setSuccessor(rhuang); //将“黄蓉”作为“张无忌”的下家
rhuang.setSuccessor(gyang); //将“杨过”作为“黄蓉”的下家
gyang.setSuccessor(jguo);
jguo.setSuccessor(meeting);

纯的职责链模式

  • 一个具体处理者对象只能在两个行为中选择一个:要么承担全部责任,要么将责任推给下家

  • 不允许出现某一个具体处理者对象在承担了一部分或全部责任后又将责任向下传递的情况

  • 一个请求必须被某一个处理者对象所接收不能出现某个请求未被任何一个处理者对象处理的情况

不纯的职责链模式

  • 允许某个请求被一个具体处理者部分处理后向下传递或者一个具体处理者处理完某请求后其后继处理者可以继续处理该请求

  • 一个请求可以最终不被任何处理者对象所接收并处理

  • JavaScript的事件浮升(Event Bubbling)处理机制

image-20221213202619514

不纯的职责链模式:onclick触发机制

模式优点

  • 使得一个对象无须知道是其他哪一个对象处理其请求,降低了系统的耦合度

  • 可简化对象之间的相互连接

  • 给对象职责的分配带来更多的灵活性

  • 增加一个新的具体请求处理者时无须修改原有系统的代码只需要在客户端重新建链即可

模式缺点

  • 不能保证请求一定会被处理

  • 对于比较长的职责链,系统性能将受到一定影响,在进行代码调试时不太方便

  • 如果建链不当,可能会造成循环调用,将导致系统陷入死循环

模式适用环境

  • 有多个对象可以处理同一个请求,具体哪个对象处理该请求待运行时刻再确定

  • 在不明确指定接收者的情况下,向多个对象中的一个提交一个请求

  • 可动态指定一组对象处理请求

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2023-2024 Guijie Wang
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信