设计模式-Command(命令模式)
命令模式-封装调用
定义:命令模式将“请求”封装成对象,以便使用不同的请求,队列或者日志来参数化其他对象,命令模式也支持可撤销的操作。
PS:今天整理这个命令模式的时候,状态不好,浑浑沌沌的,所以代码demo尽量精简,后续有机会再封装一个完成的具有扩展性的demo,
个人理解命令模式,其实就是请求(或者命令)的发送者,请求者,不需要知道也不需要跟请求的执行者之间有什么关系,请求发送者把一个命令(包含:对象-执行者,命令-执行什么事情)发送给中间的接受者,由中间的人执行调用对应的执行命令。举个例子你去下馆子吃饭,三个主要角色 你 -顾客,服务员,厨师,这三个角色把你下馆子吃饭的所有流程都可以包含进去,其中你下单就是一个典型的命令模式,你不需要了解厨师是怎么操作的,但是你知道厨师都会做菜(命令的接口),每一个菜单上面的菜都是一个具体的命令,你把某个或者某些命令交给服务员就可以了,下命令和具体执行命令的之间没有关系,没有直接的交流从而达到解耦的目的,同时你可以下多个订单,让不同的厨师做,还可以撤销订单(当然还没做的),等等你只要把对应的命令发送给服务员就可以了。今天废话有点多,直接上代码吧 早点回去睡觉要紧
<?php /** * @desc 命令模式 * 命令模式将“请求”封装成对象,以便使用不同的请求,队列或者日志来参数化其他对象,命令模式也支持可撤销的操作。 * 使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活。 * * 一个顾客向服务员下了一单厨师李四做的鱼香肉丝的菜单 * * Command: 抽象命令类 做菜 ConcreteCommand: 具体命令类 做一个鱼香肉丝的菜 Invoker: 调用者 服务员 Receiver: 接收者 厨师 Client:客户类 顾客 实例, 推送一个请求更新的命令,更新一篇文章 */ interface Command{ //接口订单 所有的订单需要实现这个execute方法 public function execute(); } //具体的订单 例如来个鱼香肉丝 class YXRSCommand implements Command{ private $receiver;//命令的具体执行者或者说是接受者 public function __construct(Receiver $receiver){ $this->receiver = $receiver; } public function execute(){ return $this->receiver->doYXYS(); //封装一个让厨师做一道鱼香肉丝的菜 } } //比如厨师 class Receiver{ //一般是具体的类,第三方提供的类 private $name; public function __construct($name){ $this->name = $name; //某一个厨师 } //第三方一般会有很多的具体的函数 public function doGBJD(){ // 宫保鸡丁 return $this->name.__FUNCTION__; } public function doYXYS(){// 鱼香肉丝 return $this->name.__FUNCTION__; } public function doFQFP(){// 夫妻肺片 return $this->name.__FUNCTION__; } /** * funtions dengdeng */ } class Invoker { //招待员 招待员接到下的订单命令 并让这个封装的命令执行 //这里 有两个点没有去实现 setCommand 动态的变更命令 //或者 命令集合 用数组保存 excute的时候 遍历执行,类似队列的形式等等 删除命令 撤销命令 这些都是在这个的基础上的其他特性 //这里为了更简单的理解命令模式 所以暂时不实现,以后有机会可以实现一个完整的demo或者用具体的实例来做 private $concreteCommand;//具体的封装了reciver和具体的execute的类 public function __construct(Command $concreteCommand){ //这边可以用setCommand 封装多个命令 $this->concreteCommand = $concreteCommand; } public function executeCommand(){ // 招待下单 触发执行 orderUp return $this->concreteCommand->execute(); } } class Client{ function doUpAction(){ $receiver = new Receiver('李四');//一个叫李四的厨师 $YXRSCommand = new YXRSCommand($receiver); //一道让李四这个厨师做一个鱼香肉丝的命令 $invoker = new Invoker($YXRSCommand); //把这个订单交给一个招待 return $invoker->executeCommand(); //招待执行这个命令 } } $client = new Client(); echo $client->doUpAction();
回头补上多个命令和撤销命令还有一些日志队列什么的demo