码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式之行为型模式—— 3.5 职责链模式

时间:2015-02-17 23:42:02      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:设计模式 职责链模式

<?php

	/**
	 * 3.5 职责链模式
	 * 	定义:
	 * 		使多个对象都有机会处理请求,从而避免请求的
	 * 		发送者和接受者直接的耦合关系。将这个对象连
	 * 		成一条链,并沿着这条链传递该请求,直到有一
	 * 		个对象处理它为止。
	 * 	角色:
	 * 		1. 抽象Handler类
	 * 			职责:定义一个处理请示的接口。
	 * 		2. 具体Handler类
	 * 			职责:具体处理者类,处理它所负责的请求
	 * 				  ,它可访问它的后继者,如果可处理
	 * 				  该请求,就处理之,否则就将该请求
	 * 				  转发给它的后继者。
	 *
	 * 	优点:
	 * 		1. 增强了系统的可扩展性;
	 * 		2. 是可以避免过多的if或if-else语句;
	 * 		3. 减小了对象之间的耦合性;
	 * 		4. 可以根据需要自由组合工作流程。如工作流程
	 * 		   发生变化,可以通过重新分配对象链便可适应
	 * 		   新的工作流程;
	 * 		5. 责任分担。每个类只需处理自己该处理的工作
	 * 		   (不该处理的传递给下一个对象完成),明确
	 * 		   各类的责任范围,符合单一职责原则。
	 * 		
	 * 	缺点:
	 * 		1. 使用此模式时会产生多处理者对象,但实际使
	 * 		   用的处理者对象却只有一个,这在某种程度讲
	 * 		   是资源的浪费。
	 * 		2. 职责链建立的合理性要靠客户端来保证,增加
	 * 		   了程序的复杂性,也有可能由于职责链导致出
	 * 		   错。
	 * 		   
	 * 	使用场景:
	 * 		1. 有多个对象可以处理一个请求,具体是哪个对象
	 * 		   处理该请求运行时自动确定。
	 * 		2. 你想在不明确指定接受者的情况下,向多个对象
	 * 		   中的一个提交一个请求。
	 * 		3. 可处理一个请求的对象集合应被动态指定。
	 */

	//抽象Handler类
	abstract class Handler{
		protected $successor;
		public function setSuccessor(Handler $successor){
			$this->successor=$successor;
		}
		abstract public function handlerRequest($request);
	}
	//具体Handler类
	class ConcreteHandler1 extends Handler{
		public function handlerRequest($request){
			if($request >= 0 && $request < 10){
				echo get_class($this).‘处理请求‘.$request;
			}else if($this->successor != null){
				$this->successor->handlerRequest($request);
			}
		}
	}
	class ConcreteHandler2 extends Handler{
		public function handlerRequest($request){
			if($request >= 10 && $request < 20){
				echo get_class($this).‘处理请求‘.$request;
			}else if($this->successor != null){
				$this->successor->handlerRequest($request);
			}
		}
	}
	class ConcreteHandler3 extends Handler{
		public function handlerRequest($request){
			if($request >= 20 && $request < 30){
				echo get_class($this).‘处理请求‘.$request;
			}else if($this->successor != null){
				$this->successor->handlerRequest($request);
			}
		}
	}

	//客户端
	//生成请求的具体处理对象
	$h1=new ConcreteHandler1();
	$h2=new ConcreteHandler2();
	$h3=new ConcreteHandler3();
	//设置处理对象的下一个负责人(即处理请求的对象)
	$h1->setSuccessor($h2);
	$h2->setSuccessor($h3);
	//具体的请求有职责链的第一个接收
	$h1->handlerRequest(20);
?>


本文出自 “一切皆有可能” 博客,请务必保留此出处http://noican.blog.51cto.com/4081966/1614788

设计模式之行为型模式—— 3.5 职责链模式

标签:设计模式 职责链模式

原文地址:http://noican.blog.51cto.com/4081966/1614788

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!