设计模式学习笔记-职责链模式

在一个餐厅,这个餐厅提供了不同国家的菜色,比如中国菜、法国菜和日本菜等等。当一个订单下达时,这个厨师根据自己的职责,接收订单,然后做出美味的食物。但如果这个订单不是自己的职责,那么它会直接忽略,交给另一个厨师处理。按照这种方式,把订单一直传下去,直到有人处理。

在设计模式中,类似上述过程是情况是,有一个对象链,专门处理不同请求。当请求到来时,从第一个对象开始接收,如果该对象处理不了,传递给第二对象,如果第二对象处理不了,传递给第三个。以次类推,直到有对象接收这个请求为止。实在没有对象能处理,直接忽略这个请求。

这样的实现过程在设计模式中叫做职责链模式

代码实现如下:

abstract class IChef {
	private $next = null;
	public  function Cooking($order){
		if(!$this->handle($order)) {
			
			if($this->next){
				$this->next->Cooking($order);
			}
			else {
				echo "No Chef Do it";
			}			
		}		
	}
	public  abstract function handle($order);
	public function setNext(IChef $next){
		$this->next = $next;
	}
}

class ChinaChef extends IChef{
	public function handle($order) {

		if($order == "china") {
			echo "China Food<br>";
			return true;
		}
		return false;
	}
}

class JPChef extends IChef{
	public function handle($order) {

		if($order == "jp") {
			echo "JP Food<br>";
			return true;
		}
		return false;
	}
}

class FrenchChef extends IChef{
	public function handle($order) {

		if($order == "french") {
			echo "French Food<br>";
			return true;
		}
		return false;
	}
}

$ChinaChef = new ChinaChef();
$JPChef = new JPChef();
$FrenchChef = new FrenchChef();

$ChinaChef->setNext($JPChef);
$JPChef->setNext($FrenchChef);

$ChinaChef->Cooking("jp");
$ChinaChef->Cooking("china");
$ChinaChef->Cooking("french");
$ChinaChef->Cooking("germany");

上述代码,实现不同菜色的厨师,接收不同的订单

总结

为请求创建一个对象链,使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
这一模式的想法是,给多个对象处理一个请求的机会,从而解耦发送者和接受者。

猜你喜欢

转载自blog.csdn.net/H_L_S/article/details/88071720
今日推荐