设计模式专题(十九)——命令模式
(原创内容,转载请注明来源,谢谢)
一、概念
命令模式(Command)将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以支持可撤销的操作。
该模式可以用来设计消息队列,可以按需求将命令记入日志,也允许请求方撤回请求。另外,新的命令不影响旧的类。该模式实现解耦,将请求的操作与实际的操作分开。
1、优点
1)解除了请求者与实现者之间的耦合,降低了系统的耦合度。
2)对请求排队或记录请求日志,支持撤销操作。
2、缺点
命令模式需要为每一种具体的命令设计一个类,这样如果命令太多的情况下,结果是类会太多。
二、类图
三、设计方案
命令模式主要有三种角色类——需求者(客户端)、命令发起者、命令执行者,其中需求者将需求发给命令发起者,由命令发起者作为中间类,协调多个需求者以及多个命令执行者之间的关系。
类似餐厅的点菜,需求者就是消费者,命令发起者是服务员,命令执行者是厨师。但是这里的命令发起者只有一个,以确保按照需求的先后顺序,去要求命令执行者执行命令。
命令模式共需要4个角色,invoker、command、concretecommand、receiver,分别是分发命令类、命令虚类、具体命令类、命令接收类。
1)Command:
代码语言:javascript复制//1:命令通用虚类
abstract class Command{
protected$receiver;
publicfunction __construct(Receiver $receiver){
$this->receiver= $receiver;
}
publicfunction execute(){}
}
2)ConcreteCommand:
代码语言:javascript复制//2:具体命令执行类
class ConcreteCommand extends Command{
function__construct(Receiver $receiver){
parent::__construct($receiver);
}
publicfunction execute(){
$this->receiver->action();
}
}
3)Invoker
代码语言:javascript复制//3:发动命令类
class Invoker{
private$command;
publicfunction __construct(Command $command){
$this->command= $command;
}
publicfunction setCommand(Command $command){
$this->command= $command;
}
publicfunction executeCommand(){
$this->command->execute();
}
}
4)Receiver
代码语言:javascript复制//4:命令接收者类
class Receiver{
publicfunction action(){
echo'执行请求';
}
}
5)客户端
代码语言:javascript复制$r = new Receiver();
$c = new ConcreteCommand($r);
$i = new Invoker($c);
$i->executeCommand();
——written by linhxx 2017.08.27
相关阅读: