`
java苹果+番茄
  • 浏览: 67970 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

责任链(Chain of Responsibility)模式【行为模式第十一篇】

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

责任链模式的角色:
1、抽象处理者角色:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回对下家的引用。这个角色通常由
   一个java抽象类或者java接口实现。
  
2、具体处理者角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家,由于具体处理者持有对下家的引用,因此
   ,如果需要,具体处理者可以访问下家。
//抽象处理者
		public abstract class Hander{
			//处理方法,调用此方法处理请求
			protected Handle successor;
			public abstract void handleRequest();
			
			//调用此方法,设定下家
			public void setSuccessor(Handler successor){
				this.successor = successor;
			}
			
			public Handler getSuccessor(){
				return successor;
			}
		}   
		
		//具体处理者
		public class ConcreteHandler extends Handler{
			public void handlerRequest(){
				if(getSuccessor() != null){
					System.out.println("The request is passed to " + getSuccessor());
					getSuccessor().handlerRequest();
				}else{
					System.out.println("The request is handled here.");
				}	
			}
		}
		
		//客户端
		public class Client{
			private static Handler handler1, handler2;
			
			public static void main(String args[]){
				handler1 = new ConcreteHandler();
				handler2 = new ConcreteHandler();
				handler1.setSuccessor(handler2);
				handler1.handleRequest();
			}
		}
	


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

在一个纯的责任链模式里面,一个请求必须被某一个处理者对象所接受,在一个不纯的责任链模式里面,一个请求可以最终不被
任何接受端对象所接收。
//一个贾家击鼓传花喝酒的例子
		//击鼓者(客户端)
		public class DrumBeater{
			private static Player player;
			
			public static void main(String[] args){
				//创建责任链
				player  = new JiaMu(new JiaShe(new JiaZheng(new JiaBaoYu(new JiaHuan(null)))));
				
				//规定由第四个处理者处理请求
				player.handler(4);
			}
		}
		   
		抽象传花者
		public abstract class Player{
			public abstract void handler(int i);
			
			private Player successor;
			
			public Player(){
				successor = null;
			}
			
			protected void setSuccessor(Player aSuccessor){
				successor = aSuccessor;
			}
			
			//将花传给下家,如果没有下家,系统停止运行
			public void next(int index){
				//判断下家对象是否有效
				if(successor != null){
					//将请求传给下家
					successor.handler(index);
				}else{
					//系统停止运行
					System.out.println("Program terminated.");
					System.exit(0);
				}
			}
		}  
		
		//JiaMu类
		public class JiaMu extends Player{
			public JiaMu(Player aSuccessor){
				this.setSuccessor(aSuccessor);
			}
			
			public void handler(int i){
				if(i == 1){
					System.out.println("Jia Mu gotta drink!");
				}else{
					System.out.println("JiaMu passed!");
					next(i);
				}
			}
		}
		
		//JiaShe
		
		public class JiaShe extends Player{
			public JiaShe(Player aSuccessor){
				this.setSuccessor(aSuccessor);
			}
			
			public void handler(int i){
				if(i == 2){
					System.out.println("Jia She gotta drink!");
				}else{
					System.out.println("Jia She passed!");
					next(i);
				}
			}
		}
		
		public class JiaZheng extends Player{
			public JiaZheng(Player aSuccessor){
				this.setSuccessor(aSuccessor);
			}
			
			public void handler(int i){
				if(i == 3){
					System.out.println("Jia Zheng gotta drink!");
				}else{
					System.out.println("Jia Zheng passed!");
					next(i);
				}
			}
		}
		
		public class JiaBaoYu extends Player{
			public JiaBaoYu(Player aSuccessor){
				this.setSuccessor(aSuccessor);
			}
			
			public void handler(int i){
				if(i == 4){
					System.out.println("Jia Bao Yu gotta drink!");
				}else{
					System.out.println("Jia Bao Yu passed!");
					next(i);
				}
			}
		}
		
		public class JiaHuan extends Player{
			public JiaHuan(Player aSuccessor){
				this.setSuccessor(aSuccessor);
			}
			
			public void handler(int i){
				if(i == 5){
					System.out.println("Jia Huan gotta drink!");
				}else{
					System.out.println("Jia Huan passed!");
					next(i);
				}
			}
		}


在下面的情况下可以使用责任链模式:
(1)系统已经有一个由处理者对象组成的链。这个链可能由合成模式给出。
(2)有多于一个的处理者对象会处理一个请求,而且事先并不知道到底由哪一处理者对象处理一个请求。
     这个处理者对象是动态确定的。
(3)系统想发出一个请求给多个处理者对象中的某一个,但是不明显指定是哪一个处理者对象会处理此请求。
(4)处理一个请求的处理者对象的集合需要动态地指定时。
责任链模式降低了发出命令的对象和处理命令的对象之间的耦合,它允许多于一个的处理者对象根据自己的逻辑来决定
哪一个处理者最终处理这个命令。换言之,发出命令的对象只是把命令传给链结构的起始者,而不需要知道到底是链上
的哪一个节点处理了这个命令。

显然。这意味着在处理命令时,允许系统有更多的灵活性。哪一个对象最终处理一个命令可以因为由哪些对象参加责任链,
以及这些对象在责任链上的位置不同而有所不同。

//一个使用Timer的例子
		import java.util.Timer;
		import java.util.TimerTask;
		public class Reminder{
			Timer timer;
			//构造子,在seconds秒后执行一个任务
			public Reminder(int seconds){
				timer = new Timer();
				timer.schedule(new RemindTask(),seconds*1000);	//schedule(清单,目录)
			}
			
			//内部成员类,描述将要执行的任务
			class RemindTask extends TimerTask{
				public void run(){
					System.out.println("Time's up!");
					timer.cancle();
				}
			}
			
			public static void main(String[] args){
				System.out.println("About to schedule task.");
				new Reminder(5);
				System.out.println("Task scheduled.");
			}
			
		}
		//Timer类是线程安全的,换言之,可以有多个线程共享同一个Timer对象,而不需要同步化。这是使用Timer的一个好处。
		   
		//击鼓者(相当于客户端)
		import java.lang.Thread;
		import java.util.Timer;
		import java.util.TimerTask;
		
		public class DrumBeater{
			private static Player firstPlayer;
			public static boolean stopped = false;
			Timer timer;
			
			public static void main(String[] args){
			
				DrumBeater drumBeater = new DrumBeater();
				JiaMu jiaMu = new JiaMu(null);
				JiaMu.setSuccessor(new JiaShe(new JiaZheng(new JiaBaoYu(new JiaHuan(jiaMu)))));
				
				//开始击鼓过程
				drumBeater.startBeating(1);
				//由贾母开始传花
				firstPlayer = jiaMu;
				firstPlayer.handle();
			}
			
			//调用下面方法,开始击鼓过程
			public void startBeating(int stopInSeconds){
				System.out.println("Drum beating started...");
				timer = new Timer();
				timer.schedule(new StopBeatingReminder(),stopInSeconds*1000);
			}
			
			//内部成员类,描述停止击鼓的任务
			class StopBeatingReminder extends TimerTask{
				public void run(){
					System.out.println("Drum beating stopped!");
					stopped = true;
					timer.cancel();
				}
			}
		}   
		
		//抽象传花者类
		public abstract class Player{
			public abstract void handle();
			
			private Player successor;
			
			public Player(){
				successor = null;
			}
			
			protected void setSuccessor(Player aSuccessor){
				successor = aSuccessor;
			}
			
			public void next(){
				//判断下家对象是否有效
				if(successor != null){
					//将请求传给下家
					successor.handle();
				}else{
					//系统停止运行
					System.out.println("Program is terminating.");
					System.exit(0);
				}
			}
		}
		
		//贾母
		public class JiaMu extends Player{
			public JiaMu(Player aSuccessor){
				this.setSuccessor(aSuccessor);
			}
			
			public void handle(){
				//检查是否击鼓已经停止]
				if(DrumBeater.stopped){
					System.out.pritntln("Jia Mu gotta drink!");
				}else{
					System.out.println("Jia Mu passed!");
					next();
				}
			}
		}
		......................
		public class JiaHuan extends Player{
			public JiaHuan(Player aSuccessor){
				this.setSuccessor(aSuccessor);
			}
			
			public void handle(){
				//检查是否击鼓已经停止]
				if(DrumBeater.stopped){
					System.out.println("Jia Huan gotta drink!");
				}else{
					System.out.println("Jia Huan passed!");
					next();
				}
			}
		}
分享到:
评论

相关推荐

    C#设计模式_设计模式_C#_

    创建型: 1. 单件模式(Singleton ... 职责链模式(Chain of Responsibility Pattern) 20. 备忘录模式(Memento Pattern) 21. 策略模式(Strategy Pattern) 22. 访问者模式(Visitor Pattern) 23. 状态模式(State Pattern)

    07-使用代理快速接入第三方库(1).html

    责任链模式( Chain of Responsibility ) 命令模式( Command ) 备忘录模式( Memento ) 状态模式( State ) 访问者模式( Visitor ) 中介者模式( Mediator ) 解释器模式( Interpreter ) 书中通过一幅图,...

    第十九讲:职责链模式

    职责链模式(Chain of Responsibility Pattern)是一种行为设计模式,它使你能在不指定接收者的情况下,将请求沿着处理者链进行发送。每个处理者都包含对下一个处理者的引用,允许请求在链中传递,直到被某个处理者...

    Delphi模式编程第一分卷

    第16章 责任链模式(Chain of Responsibility) 16.1 模式解说 16.2 结构和用法 16.2.1 模式结构 16.2.2 代码模板 16.2.3 问题讨论 16.3 范例与实践 16.3.1 责任链模式在项目审批系统中的应用 16.3.2 责任链...

    Delphi模式编程第二分卷

    第16章 责任链模式(Chain of Responsibility) 16.1 模式解说 16.2 结构和用法 16.2.1 模式结构 16.2.2 代码模板 16.2.3 问题讨论 16.3 范例与实践 16.3.1 责任链模式在项目审批系统中的应用 ...

    java设计模式ppt

    责任链模式 (Chain of Responsibility Pattern) 责任链模式是一种行为型模式,使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合。通过将接收对象连成一条链并沿着这条链传递请求,直到有一...

    java设计模式第二版源码

    行为型模式则关注对象之间的交互和责任分配,例如策略模式(Strategy)、观察者模式(Observer)和责任链模式(Chain of Responsibility)。 "Java设计模式第二版源码"可能包含了这些模式的实例,每个模式都通过...

    第二十五 设计模式

    3. **行为型模式**:这类模式主要涉及对象间责任分配和交互,包括责任链(Chain of Responsibility)、命令(Command)、解释器(Interpreter)、迭代器(Iterator)、中介者(Mediator)、备忘录(Memento)、观察...

    C#23种设计模式【完整】.pdf

    17. 职责链模式(Chain of Responsibility Pattern):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。 18. 备忘录模式(Memento Pattern):在不破坏封装的前提下,捕捉一个对象的内部...

    深浅设计模式1,13中文版

    3. **行为型模式**:如策略模式(Strategy)、观察者模式(Observer)、责任链模式(Chain of Responsibility)等。这些模式关注对象之间的交互和职责分配,有助于实现灵活的程序架构。 4. **设计原则**:包括单一...

    Headfirst设计模式中文高清PDF+附书源码

    11. **职责链模式**(Chain of Responsibility):避免将请求的发送者和接收者耦合在一起,让多个对象都有可能处理这个请求。Java中的异常处理机制就体现了职责链模式。 以上仅是《Headfirst设计模式》中部分核心...

    第四章:Spring AOP API 设计模式1

    12. **责任链模式(Chain of Responsibility)**:Spring AOP中的通知(Advice)链可以被视为责任链模式的应用,每个通知都可以选择处理请求或将其传递给下一个通知。 13. **观察者模式(Observer)**:Spring AOP...

    ASP.NET设计模式-杨明军译(源码)

    8.3.2 Chain of Responsibility模式 8.4 Model-View-Controller 8.4.1 ViewModel模式 8.4.2 ASP.NET MVC框架 8.4.3 利用AutoMapper映射ViewModel 8.4.4 Castle MonoRail 8.5 Page Controller模式 8.6 小结 ...

    软件架构模式的种类 三种模式

    14. **Chain of Responsibility(责任链)模式**:让多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。 15. **Memento(备忘录)模式**:在不破坏封装性的前提下,捕获一个对象的内部状态,...

    java设计模式解释

    #### 十三、责任链模式(Chain of Responsibility) **定义:** 责任链模式是一种行为型设计模式,允许多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条...

    经典:《设计模式》10

    2. 责任链模式(Chain of Responsibility):允许将请求沿着处理者对象的链式结构传递,直到被某个对象处理。 3. 策略模式(Strategy):定义一系列算法,并将每个算法封装起来,使它们可以互相替换。 《设计模式》...

    二十三种设计模式【PDF版】

    设计模式之 Chain of Responsibility(责任链) 各司其职的类串成一串,好象击鼓传花,当然如果自己能完成,就不要推委给下一个. 设计模式之 Mediator(中介) Mediator 很象十字路口的红绿灯,每个车辆只需和红绿灯交互...

    24种java设计模式介绍与6大设计原则

    #### 第17章 责任链模式(Chain of Responsibility Pattern) 责任链模式是一种行为型设计模式,它让多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。 ##### 描述 责任链模式通过构建一个...

    戏说23种设计模式 基于GOF的设计模式

    责任链模式(Chain of Responsibility) 责任链模式允许多个处理者处理请求。请求沿着处理者链传递,直到其中一个处理者处理它为止。这种模式通常用于处理事务流程或消息传递。例如,在处理用户请求时,可以按顺序...

Global site tag (gtag.js) - Google Analytics