命令模式通过封装请求为对象,实现调用者与接收者解耦;其核心包括命令接口、具体命令、接收者、调用者和客户端;如遥控器示例所示,Light类为接收者,Command接口定义execute方法,LightOnCommand和LightOffCommand绑定灯操作,RemoteControl作为调用者执行命令,客户端组装并传递命令;该模式支持撤销重做、命令队列与扩展新命令,符合开闭原则,适用于PHP中的任务调度与工作流控制。

PHP命令模式是一种设计模式,用来将请求封装成一个对象,从而让你可以用不同的请求、队列或日志来参数化对象。它让请求的发送者和接收者解耦,也就是说,调用某个操作的对象(发送者)不需要知道具体执行操作的是谁(接收者)。
命令模式的核心角色
理解命令模式的关键是搞清楚它的几个组成部分:
- 命令接口(Command):定义执行操作的接口,通常是一个execute方法。
- 具体命令(ConcreteCommand):实现命令接口,负责绑定接收者,并在执行时调用接收者的相应方法。
- 接收者(Receiver):真正执行任务的对象,比如一个用户服务类、文件处理器等。
- 调用者(Invoker):持有命令对象并触发命令的执行,它不关心具体做什么,只负责“调用”。
- 客户端(Client):创建命令对象,并将其与接收者绑定,再交给调用者使用。
一个简单的例子
假设你要做一个远程控制器,可以执行“打开灯”和“关闭灯”的操作。
// 接收者:灯 class Light { public function on() { echo "灯打开了\n"; } public function off() { echo "灯关闭了\n"; } } // 命令接口 interface Command { public function execute(); } // 具体命令:开灯 class LightOnCommand implements Command { private $light; public function __construct(Light $light) { $this->light = $light; } public function execute() { $this->light->on(); } } // 具体命令:关灯 class LightOffCommand implements Command { private $light; public function __construct(Light $light) { $this->light = $light; } public function execute() { $this->light->off(); } } // 调用者:遥控器 class RemoteControl { private $command; public function setCommand(Command $command) { $this->command = $command; } public function pressButton() { $this->command->execute(); } } // 客户端代码 $light = new Light(); $onCommand = new LightOnCommand($light); $remote = new RemoteControl(); $remote->setCommand($onCommand); $remote->pressButton(); // 输出:灯打开了命令模式的好处
使用命令模式能带来几个明显优势:
CPWEB企业网站管理系统(以下称CPWEB)是一个基于PHP+Mysql架构的企业网站管理系统。CPWEB 采用模块化方式开发,功能强大灵活易于扩展,并且完全开放源代码,面向大中型站点提供重量级企业网站建设解决方案。CPWEB企业网站管理系统 2.2 Beta 测试版本,仅供测试,不建议使用在正式项目中,否则发生任何的后果自负。
立即学习“PHP免费学习笔记(深入)”;
- 解耦调用者和接收者:调用者不需要知道谁在执行、怎么执行,只需要知道“有命令可以执行”。
- 支持撤销和重做:命令对象可以记录状态,实现undo/redo功能。
- 支持命令队列:可以把多个命令存入队列,延迟执行或批量处理。
- 容易扩展新命令:新增功能只需添加新的命令类,符合开闭原则。
基本上就这些。命令模式在PHP中常用于任务调度、操作日志、工作流控制等场景,虽然看起来多写了几层类,但换来了更高的灵活性和可维护性。不复杂但容易忽略。










