设计模式专题(十九) ——命令模式

时间:2022-05-03
本文章向大家介绍设计模式专题(十九) ——命令模式,主要内容包括设计模式专题(十八) ——桥接模式、设计模式专题(十七) ——单例模式、设计模式专题(十六)——迭代器模式、设计模式专题(十五) ——组合模式、设计模式专题(十四)——适配器模式、设计模式专题(十三) ——备忘录模式、设计模式专题(十二)——状态模式、设计模式专题(十一)——抽象工厂模式、设计模式专题(十)——观察者模式、设计模式专题(九) ——外观模式、设计模式专题(八) ——模板方法模式、设计模式专题(七)——建造者模式、设计模式专题(六)——原型模式、设计模式专题(五)——工厂方法模式、设计模式专题(四)——代理模式、设计模式专题(三)——装饰模式、设计模式专题(二)——策略模式、设计模式专题(一)——面向对象的设计原则、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

设计模式专题(十九)——命令模式

(原创内容,转载请注明来源,谢谢)

一、概念

命令模式(Command)将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以支持可撤销的操作。

该模式可以用来设计消息队列,可以按需求将命令记入日志,也允许请求方撤回请求。另外,新的命令不影响旧的类。该模式实现解耦,将请求的操作与实际的操作分开。

1、优点

1)解除了请求者与实现者之间的耦合,降低了系统的耦合度。

2)对请求排队或记录请求日志,支持撤销操作。

2、缺点

命令模式需要为每一种具体的命令设计一个类,这样如果命令太多的情况下,结果是类会太多。

二、类图

三、设计方案

命令模式主要有三种角色类——需求者(客户端)、命令发起者、命令执行者,其中需求者将需求发给命令发起者,由命令发起者作为中间类,协调多个需求者以及多个命令执行者之间的关系。

类似餐厅的点菜,需求者就是消费者,命令发起者是服务员,命令执行者是厨师。但是这里的命令发起者只有一个,以确保按照需求的先后顺序,去要求命令执行者执行命令。

命令模式共需要4个角色,invoker、command、concretecommand、receiver,分别是分发命令类、命令虚类、具体命令类、命令接收类。

1)Command:

//1:命令通用虚类
abstract class Command{
         protected$receiver;
         publicfunction __construct(Receiver $receiver){
                   $this->receiver= $receiver;
         }
         publicfunction execute(){}
}

2)ConcreteCommand:

//2:具体命令执行类
class ConcreteCommand extends Command{
         function__construct(Receiver $receiver){
                   parent::__construct($receiver);
         }
         publicfunction execute(){
                   $this->receiver->action();
         }
}

3)Invoker

//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

//4:命令接收者类
class Receiver{
         publicfunction action(){
                   echo'执行请求';
         }
}

5)客户端

$r = new Receiver();
$c = new ConcreteCommand($r);
$i = new Invoker($c);
$i->executeCommand();

——written by linhxx 2017.08.27

相关阅读:

设计模式专题(十八) ——桥接模式

设计模式专题(十七) ——单例模式

设计模式专题(十六)——迭代器模式

设计模式专题(十五) ——组合模式

设计模式专题(十四)——适配器模式

设计模式专题(十三) ——备忘录模式

设计模式专题(十二)——状态模式

设计模式专题(十一)——抽象工厂模式

设计模式专题(十)——观察者模式

设计模式专题(九) ——外观模式

设计模式专题(八) ——模板方法模式

设计模式专题(七)——建造者模式

设计模式专题(六)——原型模式

设计模式专题(五)——工厂方法模式

设计模式专题(四)——代理模式

设计模式专题(三)——装饰模式

设计模式专题(二)——策略模式

设计模式专题(一)——面向对象的设计原则