<?php /** * 3.3 命令模式 * 定义: * 讲一个请求封装为一个对象,从而是你可用不同的请求对客 * 户进行参数化;对请求排队或记录日志,以及支持可撤销的 * 操作。 * 角色: * 1. 抽象Command类 * 职责:用来声明执行操作的接口。 * 2. 具体Command类 * 职责:将一个接收者对象绑定于一个动作,调用接收者 * 相应的操作,以实现Execute。 * 3. Invoker类 * 职责:要求该命令执行这个请求。 * 4. Receiver类 * 职责:知道如何实施与执行一个与请求相关的操作,任 * 何类都可能作为一个接受者。 * 优点: * 1. 它能较容易地设计一个命令队列; * 2. 在需要的情况下,可以较容易地将命令记入日志; * 3. 允许接收请求的一方决定是否要否决请求; * 4. 可以容易的实现对请求的撤销和重做; * 5. 因为加进新的具体命令类不影响其他的类,因此增加新 * 的具体命令类很容易; * 6. 把请求一个操作的对象与知道怎么执行一个操作的对象 * 分隔开。 * 缺点: * 1. 有可能会导致某些系统有过多的具体命令类。因为针对 * 每一个命令都需要设计一个具体命令类,因此某些系统 * 需要大量具体命令类,这将影响命令模式的使用。 * 使用场景: * 1. 系统需要将请求调用者和请求接收者解耦,使得调用者 * 和接收者不直接交互。 * 2. 系统需要在不同的时间指定请求、将请求排队和执行请 * 求。 * 3. 系统需要支持命令的撤销操作和恢复操作。 * 4. 系统需要将一组操作组合在一起,即支持宏命令。 * */ header(‘content-type:text/html;charset=utf8‘); //抽象Command类 abstract class Command{ protected $receiver; public function __construct($receiver){ $this->receiver=$receiver; } abstract public function execute(); } //具体Command类 class ConcreteCommand extends Command{ public function execute(){ $this->receiver->action(); } } //Invoker类 //此类是用来接收来自客户端的请求,然后将请求转化为命令的执行 //命令执行的动作,最后是由最终的接受者来处理的。 class Invoker{ private $cmd; public function setCommand(Command $cmd){ $this->cmd=$cmd; } public function executeCommand(){ $this->cmd->execute(); } } //Receiver类 class Receiver{ public function action(){ echo ‘执行请求‘; } } //客户端 //请求命令的发起者 $invoker=new Invoker(); //请求命令的最终执行者 $receiver=new Receiver(); //具体的请求 $cmd=new ConcreteCommand($receiver); //表示要设置并执行哪个请求(命令) $invoker->setCommand($cmd); $invoker->executeCommand();
时间: 2024-10-27 19:53:39