java-设计模式(行为型)-【责任链模式】

1.Chain Of Responsibility(责任链模式)

定义:有多个对象,每个对象持有对下一个对象的引用,这样就会形成一条链,请求在这条链上传递,

直到某一对象决定处理该请求。但是发出者并不清楚到底最终那个对象会处理该请求。

此处强调一点就是,链接上的请求可以是一条链,可以是一个树,还可以是一个环,模式本身不约束这个,

需要我们自己去实现,同时,在一个时刻,命令只允许由一个对象传给另一个对象,而不允许传给多个对象。

优点:责任链模式可以实现,在隐瞒客户端的情况下,对系统进行动态的调整。

降低类之间的耦合性,因为无法预知该请求的属于哪种类型,每个类如果碰到它不能处理只要放弃就可以了。

缺点:效率低,因为一个请求的完成可能遍历到最后才完成,当然也可以使用树的概念优化。

关系图:

2.举例

//处理者
public interface Handler {

	//处理方法
	void operation();
}
//链节点:指向下一个对象
public abstract class AbstractHandler {

	private Handler handler=null;
	public Handler getHandler() {
		return handler;
	}

	public void setHandler(Handler handler) {
		this.handler = handler;
	}
}
//处理者实现类
class MyHandler extends AbstractHandler implements Handler
{

	private String name;
	public MyHandler (String name)
	{
		this.name=name;
	}
	@Override
	public void operation() {

		System.out.println(name+"执行任务中。。。");
	    //调用下一个对象进行处理
		if(getHandler()!=null)
		{
			Handler handler=getHandler();
			handler.operation();
		}
		else
		{
			System.out.println(name+"任务执行完毕!");
		}
	}

}

  测试:

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        MyHandler h1=new MyHandler("特工1号");
        MyHandler h2=new MyHandler("特工2号");
        MyHandler h3=new MyHandler("特工3号");
        //设置责任链的对象顺序
        h1.setHandler(h2);
        h2.setHandler(h3);
        //从h1开始执行任务
        h1.operation();
	}

}

  运行:

特工1号执行任务中。。。
特工2号执行任务中。。。
特工3号执行任务中。。。
特工3号任务执行完毕!

纯的与不纯的责任链模式

  一个纯的责任链模式要求一个具体的处理者对象只能在两个行为中选择一个:一是承担责任,而是把责任推给下家。不允许出现某一个具体处理者对象在承担了一部分责任后又 把责任向下传的情况。

  在一个纯的责任链模式里面,一个请求必须被某一个处理者对象所接收;在一个不纯的责任链模式里面,一个请求可以最终不被任何接收端对象所接收。

  纯的责任链模式的实际例子很难找到,一般看到的例子均是不纯的责任链模式的实现。有些人认为不纯的责任链根本不是责任链模式,这也许是有道理的。但是在实际的系统里,纯的责任链很难找到。如果坚持责任链不纯便不是责任链模式,那么责任链模式便不会有太大意义了。

时间: 2024-10-09 22:46:35

java-设计模式(行为型)-【责任链模式】的相关文章

[设计模式-行为型]责任链模式(Chain of Responsibility)

概括 名称 Chain of Responsibility 结构 动机 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 适用性 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定. 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求. 可处理一个请求的对象集合应被动态指定. 解析 形象比喻: 晚上去上英语课, 为了好开溜坐到了最后一排, 哇, 前面坐了好几个漂亮的MM 哎

Java设计模式系列之责任链模式

责任链模式 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任.Tomcat中的Filter就是使用了责任链模式,创建一个Filter除了要在web.xml文件中做相应配置外,还需要实现javax.servlet.Filter接口. 为了方便理解,责任链模式直接用马士

《Java设计模式》之责任链模式

责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任. 从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客依次坐定位置,由一人击鼓,击鼓的地方与传花的地方是分开的,以示公正.开始击鼓时,花束就开始依次传递,鼓声一落,如果花束在某人手中,则该人就得饮酒.

Java设计模式(七) COR(责任链)模式及Tomcat引申

基本概念 定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,知道有对象处理它为止. COR(责任链)模式的角色分工: Handler:抽象处理者,定义一个处理请求的接口 Concrete Handler: 具体处理者,处理请求的具体类,或者传给"下家". Requester:发出请求等待处理的类,它无需关注到底是哪个具体的Handler处理它的请求 COR的处理问题的场景: 一个request在多个handle

《Java设计模式 》之责任链模式

责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任. 从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客依次坐定位置,由一人击鼓,击鼓的地方与传花的地方是分开的,以示公正.开始击鼓时,花束就开始依次传递,鼓声一落,如果花束在某人手中,则该人就得饮酒.

JAVA设计模式(13):行为型-责任链模式(Responsibility)

定义 将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求, 如果能则处理,如果不能则传递给链上的一个对象. 场景: 打牌时,轮流出牌 接力赛跑 大学中,奖学金审批 公司中,公文审批 开发中常见的场景: Java中,异常机制就是一种责任链模式.一个try可以对应多个catch,当第一个catch不匹配类型,则自动跳到第二个catch. Javascript语言中,事件的冒泡和捕获机制.Java语言中,事件的处理采用观察者模式. Servlet开发中

【java设计模式】之 责任链(chain of resposibility)模式

责任链模式,顾名思义,就是一条链.这个链到底是怎么运行的呢?它主要是将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求,如果能则处理,如果不能则传递给链上的下一个对象进行处理,以此类推. 比如说公司请假需要审批,举个不恰当的例子,如果请假小于3天,主管审批:3-10天的,经理审批:10-30天的,总经理审批:超过30天的,不批准等等.这就得一步步去判断,如果撇开设计模式不看的话,那么我们可以使用if-else-把它解决了,但是问题可想而知,实际中

设计模式学习-责任链模式

1.定义 避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止. 2.类图 3.代码示例 1 package com.zhaoyangwoo.chainOfResponsibility; 2 3 /** 4 * Created by john on 16/6/16. 5 * 职责链模式,经费审批场景 6 */ 7 public class Responsibility { 8 9 public static void

设计模式--8、责任链模式

[转载]责任链模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任. 从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客依次坐定位

设计模式之GOF23责任链模式

责任链模式chain of responsibility 将能够处理同一类请求的对象连成一条链,所提交的请求依次在链上传递,直到传递至有能力处理该请求的对象,不能则传给链上下一个 场景: -打牌时 -奖学金审批 -请假审批 核心:是在客户端中才成链,也可以通过配置文件或者存在数组中加载 开发中常见场景: -try catch异常链 -javascript语言中,事件的冒泡和捕获机制 Java语言中,事件处理采用观察者模式 -Servlet开发中,过滤器的链式处理 -Struts2中,拦截器的调用