设计模式-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
