职责链模式(Chain of Responsibility Pattern)

本文通过一个餐饮场景的例子,展示了如何使用PHP实现职责链设计模式。该模式定义了一个处理请求的对象集合,并沿着该链传递请求,直到有一个对象处理它。文中详细介绍了顾客、服务生、主厨及二等厨师的角色扮演及其职责传递过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<?php
//职责链模式
//顾客类
class Customer {
	//菜名
	private $orderName;

	//get set 方法
	public function __set($key, $value) {
		$this->$key = $value;
	}
	public function __get($key) {
		if(isset($this->$key)) {
			return $this->$key;
		} else {
			return NULL;
		}
	}

}

//雇员类
abstract class Employee {
	//雇员姓名
	protected $name;
	//职责链下一环
	protected $successor;

	public function __construct($name) {
		$this->name = $name;
	}

	//设定职责链下一环
	public function setSuccessor(Employee $successor) {
		$this->successor = $successor;
	}

	//处理任务转交任务给下一职责人
	public function handleRequest(Customer $customer) {
		if(!empty($this->successor)) {
			$this->successor->handleRequest($customer);
		}
	}
}

//服务生
class Server extends Employee {}

//主厨
class Chef extends Employee {
	public function handleRequest(Customer $customer) {
		//判断是否自己职责所在
		if($customer->orderName == '农家小炒肉') {
			echo $this->name.'做了'.$customer->orderName.'<br/>';
		} else {
			//调用父类方法(父类的判断等代码不用重复写)
			parent::handleRequest($customer);
		}
	}
}

//二等厨师
class AssistantChef extends Employee {
	public function handleRequest(Customer $customer) {
		if($customer->orderName == '酸辣土豆丝') {
			echo $this->name.'做了'.$customer->orderName.'<br/>';
		} else {
			parent::handleRequest($customer);
		}
	}
}

//实例化雇员
$server = new Server('张三');
$chef = new Chef('李四');
$assistantChef = new AssistantChef('王五');
//定义职责链
$server->setSuccessor($chef);
$chef->setSuccessor($assistantChef);

//实例化顾客类
$customer = new Customer();
//点菜
$customer->orderName = '酸辣土豆丝';
//给服务员(职责链开始)
$server->handleRequest($customer);

$customer->orderName = '农家小炒肉';
$server->handleRequest($customer);
?>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值