JAVA设计模式之 职责链模式【Chain of Responsibility Pattern】

一、概述

避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。职责链模式是一种对象行为型模式。

核心在于引入一个抽象处理者类

二、适用场景

请求的链式处理,多个对象可以处理同一请求、但是具体由哪个对象来处理由运行时系统根据条件判断确定。

如请假业务场景:

三、UML类图

四、参与者

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

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

注意:职责链模式并不创建职责链,职责链的创建工作必须由系统的其他部分来完成,一般是在使用该职责链的客户端中创建职责链。

五、用例学习

1、抽象处理者类:Handler.java

/**
 * 抽象处理者类
 * @author  [email protected]
 *
 */
public abstract class Handler {

	protected Handler nextHandler;

	public void setNextHandler(Handler nextHandler){
		this.nextHandler = nextHandler;
	}

	public abstract void handleRequest(int request);

}

2、具体处理者类A:部门组长 ConcreteHandlerA.java

/**
 * 具体职责处理者A:案例中的 部门组长角色
 * @author  [email protected]
 *
 */
public class ConcreteHandlerA extends Handler {

	@Override
	public void handleRequest(int leaveDay) {
		if(leaveDay <= 1){
			// 满足处理条件  处理请求
			System.out.println("请假天数小于2天  由部门组长审批");
		} else {
			nextHandler.handleRequest(leaveDay);
		}

	}

}

3、具体处理者类B:部门经理 ConcreteHandlerB.java

/**
 * 具体职责处理者B:案例中的 部门经理角色
 * @author  [email protected]
 *
 */
public class ConcreteHandlerB extends Handler {

	@Override
	public void handleRequest(int leaveDay) {
		if(1 < leaveDay && leaveDay <= 5){
			// 满足处理条件  处理请求
			System.out.println("请假天数大于1天且小于等于5天  由部门经理审批");
		} else {
			nextHandler.handleRequest(leaveDay);
		}

	}

}

4、具体处理者类C:总经理 ConcreteHandlerC.java

/**
 * 具体职责处理者C:案例中的 总经理角色
 * @author  [email protected]
 *
 */
public class ConcreteHandlerC extends Handler {

	@Override
	public void handleRequest(int leaveDay) {
		if(leaveDay > 5){
			System.out.println("当请假天数大于5天的情况下 由总经理亲自操刀审批。总经理的职责已经是最大的啦,还有他没有权限处理的事吗?");
		}
	}

}

5、客户端类:Client.java

/**
 * 客户端类<br/>
 * 负责创建职责链和发送请求<br/>
 * 当职责链(职责的传递顺序/请求的处理顺序)建好之后,客户端只负责将请求发送出去,
 * 而具体请求在职责链上的传递和最终由链上的哪个对象进行处理不由客户端关心
 * @author  [email protected]
 *
 */
public class Client {

	public static void main(String[] args) {
		Handler handlerA,handlerB,handlerC;
		handlerA = new ConcreteHandlerA();
		handlerB = new ConcreteHandlerB();
		handlerC = new ConcreteHandlerC();

		// 创建职责链  handlerA ——> handlerB ——> handlerC
		handlerA.setNextHandler(handlerB);
		handlerB.setNextHandler(handlerC);

		// 发送请假请求一
		handlerA.handleRequest(1);

		// 发送请假请求二
		handlerA.handleRequest(7);

		// 发送请假请求二
		handlerA.handleRequest(3);
	}

}

6、运行结果:

请假天数小于2天  由部门组长审批
当请假天数大于5天的情况下 由总经理亲自操刀审批。总经理的职责已经是最大的啦,还有他没有权限处理的事吗?
请假天数大于1天且小于等于5天  由部门经理审批
时间: 2024-10-12 22:52:50

JAVA设计模式之 职责链模式【Chain of Responsibility Pattern】的相关文章

责任链模式 职责链模式 Chain of Responsibility Pattern 行为型 设计模式(十七)

责任链模式(Chain of Responsibility Pattern) 职责链模式 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系 将这些对象连接成一条链,并沿着这条链传递请求,直到有一个对象处理它为止. 责任链模式中,每个对象通过持有对下家的引用而链接起来,形成一条链条,串联起来多个处理对象. 在责任链模式中,请求在链上进行传递,直到链上的某一个对象决定处理此请求. 发出这个请求的客户端程序并不知道到底是哪一个对象具体的处理了请求 这使得系统可以在不影响客户

设计模式之职责链模式(Chain of Responsibility)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化托付给还有一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些详细的类的信息封装起来.第二,它们隐藏了这些类的实例是怎样被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,

设计模式(行为型)之职责链模式(Chain of Responsibility Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(行为型)之状态模式(State Pattern)>http://blog.csdn.net/yanbober/article/details/45502665 概述 职责链可以是一条直线.一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求.链

行为型设计模式之职责链模式(Chain of Responsibility)

结构 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 适用性 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定. 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求. 可处理一个请求的对象集合应被动态指定. 1 using System; 2 3 abstract class Handler 4 { 5 protected Handler successorHand

职责链模式(chain of responsibility Pattern)

职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止. •Handler: 抽象处理者:定义出一个处理请求的接口.如果需要,接口可以定义出一个方法,以设定和返回对下家的引用.这个角色通常由一个抽象类或接口实现. •ConcreteHandler: 具体处理者:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家.由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家.

java设计模式之职责链模式

[学习难度:★★★☆☆,使用频率:★★☆☆☆] "一对二","过","过"--这声音熟悉吗?你会想到什么?对!纸牌.在类似"斗地主"这样的纸牌游戏中,某人出牌给他的下家,下家看看手中的牌,如果要不起上家的牌则将出牌请求再转发给他的下家,其下家再进行判断.一个循环下来,如果其他人都要不起该牌,则最初的出牌者可以打出新的牌.在这个过程中,牌作为一个请求沿着一条链在传递,每一位纸牌的玩家都可以处理该请求.在设计模式中,我们也有一种专

atitit.设计模式(1)--—职责链模式(chain of responsibility)最佳实践O7 日期转换

atitit.设计模式(1)---职责链模式(chain of responsibility)最佳实践O7 日期转换 1. 需求:::日期转换 1 2. 可以选择的模式: 表格模式,责任链模式 1 3. 调用代码 2 4. 责任链链的特性: 2 5. 模式结构 4 6. 职责链模式包含如下角色:Handler,ConcreteHandler: 具体处理者,HandlerChainUtil ,Client 4 7. 设置哈一个handler,,两个法:排序法,指定法 5 1. 指定法 5 2. 排

图解Java设计模式之职责链模式

图解Java设计模式之职责链模式 学校OA系统的采购审批项目 :需求是 传统方案解决OA系统审批,传统的设计方案 职责链模式基本介绍 职责链模式解决OA系统采购审批 职责链模式在SpringMVC框架应用的源码 职责链模式的注意事项和细节 学校OA系统的采购审批项目 :需求是 采购员采购教学器材1)如果金额 小于等于 5000,由教学主任审批 (0<=x<=5000)2)如果金额 小于等于 10000,由院长审批(5000 < x <= 10000)3)如果金额 小于等于 3000

设计模式 ( 十二 ) 职责链模式(Chain of Responsibility)(对象行为)

 设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决.不能解决就推卸给另外个一个部门(对象).至于究竟谁来解决问题呢?政府部门就是为了能够避免屁民的请求与官员之间耦合在一起,让多个(部门)对象都有可能接收请求,将这些(部门)对象连接成一条链,而且沿着这条链传递请求.直到有(部门)对象处理它为止. 样例1:js的事件浮升机制 样例2: 2.问题 假设有多个对象都有

设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型)

1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就推卸给另外个一个部门(对象).至于到底谁来解决这个问题呢?政府部门就是为了可以避免屁民的请求与官员之间耦合在一起,让多个(部门)对象都有可能接收请求,将这些(部门)对象连接成一条链,并且沿着这条链传递请求,直到有(部门)对象处理它为止. 例子1:js的事件浮升机制 例子2: 2.问题 如果有多个对象都有可能接受请求,如何避免避免请求发送者与接收者耦合在一起呢? 3.解决方案 职责链模式(Ch