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

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

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

一、概念

命令模式(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

相关阅读:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

原文发布于微信公众号 - 决胜机器学习(phpthinker)

原文发表时间:2017-08-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏一“技”之长

iOS使用VOIP与CallKit实现体验优质的网络通讯功能

    VOIP是Apple提供给开发者的网络电话功能接口。简单来说,其可以让你的应用程序在完全杀死的情况下被服务端唤醒。CallKit是iOS10引入的新框架...

962
来自专栏木头编程 - moTzxx

微信公众平台开发[3] —— 微信公众号支付功能(PHP)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

812
来自专栏WOLFRAM

用 Wolfram 语言玩「跳一跳」

1343
来自专栏全华班

微信、支付宝、银联支付sdk组件

该组件为封装了 微信,支付宝,银联支付, 一键快速集成,几行代码即可集成 微信,支付宝,银联支付。

762
来自专栏知晓程序

你的微信输入速度超过全国 99.9% 的好友 | 晓技巧

935
来自专栏bboysoul

ubuntu下音效均衡器软件推荐(pulseaudio-equalizer)

记得第一次接触音效均衡器是初中的时候,那个时候我还在用酷狗蹭着隔壁100kb/s的网速下音乐,然后使用天天动听听音乐。为什么使用天天动听,就是因为天天动听可以设...

722
来自专栏镁客网

「产品」揭秘全球首款Android PC的奥秘

1403
来自专栏WebHub

设计师神器PixelMator Pro初体验

得益于订阅官方新闻,第一时间入手了 Pixelmator Pro( 下文称专业版 ),经过几天的简短试用,说说感想.

1053
来自专栏Android群英传

了解与建设中国特色的 Android M&N

892
来自专栏Google Dart

AngularDart4.0 英雄之旅-教程-01介绍

码云项目页:https://gitee.com/scooplolwiki/toh-6

572

扫码关注云+社区