设计模式之:职责链模式

目录

行为型模式

  • 行为型模式概述
  • 行为型模式简介

职责链模式

  • 模式动机与定义
  • 模式结构与分析
  • 模式实例与解析
  • 模式效果与应用
  • 模式扩展

行为型模式概述

  • 行为型模式(Behavioral Pattern) 关注系统中对象之间的交互,研究系统在运行时对象之间的相互通信与协作,进一步明确对象的职责
  • 行为型模式:不仅仅关注类和对象本身,还重点关注它们之间的相互作用和职责划分

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

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

行为型模式简介

图片1

模式动机与定义

奖学金审批示意图:

image

分析

  • 辅导员、系主任、院长、校长都可以处理奖学金申请表,他们构成一个处理申请表的链式结构,申请表沿着这条链进行传递,这条链就称为职责链
  • 职责链可以是一条直线、一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求
  • 链上的每一个对象都是请求处理者,职责链模式可以将请求的处理者组织成一条链,并使请求沿着链传递,由链上的处理者对请求进行相应的处理,客户端无须关心请求的处理细节以及请求的传递,只需将请求发送到链上即可,将请求的发送者和请求的处理者解耦。这就是职责链模式的模式动机

责任链模式的定义:

  • 职责链模式:避免将一个请求的发送者与接收者耦合在一起,让多个对象都有机会处理请求。将接收请求的对象连接成一条链,并且沿着这条链传递请求,直到有一个对象能够处理它为止。
  • Chain of Responsibility Pattern: 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.
  • 对象行为型模式

注:

  • 又称为责任链模式(翻译不同,J)
  • 将请求的处理者组织成一条链,并让请求沿着链传递,由链上的处理者对请求进行相应的处理
  • 客户端无须关心请求的处理细节以及请求的传递,只需将请求发送到链上,将请求的发送者和请求的处理者解耦

模式结构与分析

责任链模式的结构:

image

职责链模式包含以下两个角色:

  • Handler(抽象处理者)

抽象处理者定义了一个处理请求的接口,它一般设计为抽象类,由于不同的具体处理者处理请求的方式不同,因此在其中定义了抽象请求处理方法。因为每一个处理者的下家还是一个处理者,因此在抽象处理者中定义了一个子类型的对象(自引用),作为其对下家的引用。通过改引用,处理者可以连成一条链。

  • ConcreteHandler(具体处理者)

具体处理者是抽象处理者的子类,它可以处理用户请求,在具体处理者类中实现了抽象处理者中定义的抽象请求处理方法,在处理请求之前需要进行判断,看是否有相应的处理权限,如果可以处理请求就处理它,否则将请求转发给后继者。在具体处理者中可以方法链中下一个对象,以便请求的转发。

  • Client(客户类)

客户类用于向链中的对象提出最初的请求,客户类只需要关系链的源头,而无须关心请求处理细节以及请求的传递过程。

模式分析:

  • 在职责链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。
  • 请求在这条链上传递,直到链上的某一个对象处理此请求为止。
  • 发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。

职责链模式的实现:

经典的抽象处理者代码:

public abstract class Handler {
	protected Handler successor;

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

	public abstract void handleRequest(String request);
}

经典的具体处理这代码:

public class ConcreteHandler extends Handler {

	@Override
	public void handleRequest(String request) {
		if(/*请求request满足条件*/) {
			// 处理请求
		} else {
			this.successor.handleRequest(request); // 转发请求
		}
	}
}

经典的客户端代码:

……
Handler handler1, handler2, handler3;
handler1 = new ConcreteHandlerA();
handler2 = new ConcreteHandlerB();
handler3 = new ConcreteHandlerC();
//创建职责链
handler1.setSuccessor(handler2);
handler2.setSuccessor(handler3);
//发送请求,请求对象通常为自定义类型
handler1.handleRequest("请求对象");
……

模式实例与解析

实例说明:审批假条

某OA系统需要提供一个假条审批的模块,如果员工请假天数小于3天,主任可以审批该假条;如果员工请假天数大于等于3天,小于10天,经理可以审批;如果员工请假天数大于等于10天,小于30天,总经理可以审批;如果超过30天,总经理也不能审批,提示相应的拒绝信息。

实例类图:

image

模式效果与应用

职责链模式的优点

  • 降低耦合度
  • 可简化对象的相互连接
  • 增强给对象指派职责的灵活性
  • 增加新的请求处理类很方便

职责链模式的缺点

  • 不能保证请求一定被接收。
  • 系统性能将受到一定影响,而且在进行代码调试时不太方便;可能会造成循环调用。

模式适用环境

  • 有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。
  • 在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
  • 可动态指定一组对象处理请求。

模式应用

  • Java中的异常处理机制
try
{
    …… 			
}
catch(ArrayIndexOutOfBoundsException e1)
{
    ……
}
catch(ArithmeticException e2)
{
    ……
}
catch(IOException e3)
{
    ……
}
finally
{
    ……
}
  • 早期的Java AWT事件模型(JDK 1.0及更早) :事件浮升(Event Bubbling)机制。
  • JavaScript事件浮升机制:

image

模式扩展:纯与不纯的职责链模式

纯与不纯的职责链模式

  • 一个纯的职责链模式要求一个具体处理者对象只能在两个行为中选择一个:一个是承担责任,另一个是把责任推给下家。不允许出现某一个具体处理者对象在承担了一部分责任后又将责任向下传的情况。
  • 在一个纯的职责链模式里面,一个请求必须被某一个处理者对象所接收;在一个不纯的职责链模式里面,一个请求可以最终不被任何接收端对象所接收。

本章小结

  • 行为型模式是对在不同的对象之间划分责任和算法的抽象化。行为型模式不仅仅关注类和对象的结构,而且重点关注它们之间的相互作用。通过行为型模式,可以更加清晰地划分类与对象的职责,并研究系统在运行时实例对象之间的交互。行为型模式可以分为类行为型模式和对象行为型模式两种。
  • 职责链模式可以避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。它是一种对象行为型模式。
  • 职责链模式包含两个角色:抽象处理者定义了一个处理请求的接口;具体处理者是抽象处理者的子类,它可以处理用户请求。
  • 在职责链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。
  • 职责链模式的主要优点在于可以降低系统的耦合度,简化对象的相互连接,同时增强给对象指派职责的灵活性,增加新的请求处理类也很方便;其主要缺点在于不能保证请求一定被接收,且对于比较长的职责链,请求的处理可能涉及到多个处理对象,系统性能将受到一定影响,而且在进行代码调试时不太方便。
  • 职责链模式适用情况包括:有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定;在不明确指定接收者的情况下,向多个对象中的一个提交一个请求;可动态指定一组对象处理请求。
发布了296 篇原创文章 · 获赞 35 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/yitian_z/article/details/103109575
今日推荐