php实现设计模式之 职责链模式

<?php  
 
/** 
* 职责链模式  
*  
* 为解除请求的发送者和接收者之间的耦合,而使用多个对象都用机会处理这个请求,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它  
*
抽象处理者角色:定义一个处理请求的接口,和一个后继连接(可选)

具体处理者角色:处理它所负责的请求,可以访问后继者,如果可以处理请求则处理,否则将该请求转给他的后继者。

客户类:向一个链上的具体处理者ConcreteHandler对象提交请求。
*  
*/  

/*职责链模式相对来说是比较灵活的,链可以设置成直,环形均可
 * 
 * 还有纯的责任链,不纯的责任链
 */

//抽象处理者角色,一般包含两个方法:处理请求,为请求设置继任者
abstract class Handler{
	public $next_handler;
	
	public function setNextHandler($handler){
		$this->next_handler = $handler;
	}
	
	abstract public function executeRequest($request);
} 


//具体的处理者,如果能处理,自己处理,不能处理,留给下一个继任者
class Leader extends Handler{
	public function executeRequest($request){
		if($request->days>0&&$request->days<=1){
			echo ‘团队领导已经批准‘;
		}else{
			$this->next_handler->executeRequest($request);
		}
		
	}
}

class Director extends Handler{
	public function executeRequest($request){
		if($request->days>1&&$request->days<=3){
			echo ‘总监已经批准‘;
		}else{
			$this->next_handler->executeRequest($request);
		}
	}
}

class Manager extends Handler{
	public function executeRequest($request){
		if($request->days>3){
			echo ‘总经理已经批准‘;
		}else{
			$this->next_handler->executeRequest($request);
		}	
	}
}
//请求
class Request{
	public $days;
	
	public function __construct($days){
		$this->days = $days;
	}
}

class Client{
	public static function main1(){
		//构造一个请求,三个处理角色
		$request = new Request(2);
		$leadler = new Leader();
		$director = new Director();
		$manager = new Manager();
		
		//把三者组成链
		$leadler->setNextHandler($director);
		$director->setNextHandler($manager);
		
		//链头发出请求
		$leadler->executeRequest($request);
	}
	
	public function main2(){
		$request = new Request(2);
		$leadler = new Leader();
		$director = new Director();
		$manager = new Manager();
		
		//构成了一个环形链子,谁都可以是接受者
		$leadler->setNextHandler($director);
		$director->setNextHandler($manager);
		$manager->setNextHandler($leadler);
		
		$manager->executeRequest($request);
	}
}

Client::main2();
?>

  UML类图如下:

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。