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

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

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

一、概念

命令模式(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 条评论
登录 后参与评论

相关文章

来自专栏信安之路

ring3层恶意代码实例汇总

之前一期我们学习了 IAT 的基本结构,相信大家对 C++ 有了一个基本的认识,这一期放点干货,我把 ring3 层恶意代码常用的编程技术给大家整理了一下,所有...

790
来自专栏张善友的专栏

当调用GetAuthorizationGroups() 的错误-“试图访问卸载的应用程序域“(Exception from HRESULT: 0x80131014)解决方案

针对 Windows® 平台,Microsoft 提供了三个主要目录平台:Active Directory® 域服务、每台 Windows 计算机上的本地安全帐...

1927
来自专栏钱曙光的专栏

MySQL 8 新特性介绍

广受欢迎的开源数据库MySQL 8中,包括了众多新特性,其中包括对Unicode更好的支持、对JSON格式和文档的处理,以及一直以来呼吁增加的象window函数...

4150
来自专栏逆向技术

常见注入手法第二讲,APC注入

                  常见注入手法第二讲,APC注入 首先,我们要了解下什么是APC APC 是一个简称,具体名字叫做异步过程调用,我们看下MSD...

1838
来自专栏非典型程序猿

Golang任务队列machinery使用与源码剖析(二)

在Golang任务队列machinery使用与源码剖析(一)一文中,我们主要对golang中任务队列machinery的设计结构以及具体模块的功能与源码实现进行...

1628
来自专栏杨建荣的学习笔记

通过shell脚本添加备库日志 (r9笔记第94天)

今天下午的时候,准备顺手写一个简单的脚本,但是发现很多事情较真起来真是寸步难行。在写脚本的过程中碰到了太多的问题,很多时候感觉像要实现的功能更通用,就得做更多的...

3576
来自专栏大内老A

事件(Event),绝大多数内存泄漏(Memory Leak)的元凶[上篇]

最近这两天一直在忙着为一个项目检查内存泄漏(Memory Leak)的问题,对相关的知识进行了一下简单的学习和探索,其间也有了一些粗浅的经验积累,今天特意写一篇...

2146
来自专栏菜鸟致敬

【Lua菜鸟①】初识Lua

简介 Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。 特性 轻...

3559
来自专栏coder修行路

Python爬虫从入门到放弃(十七)之 Scrapy框架中Download Middleware用法

这篇文章中写了常用的下载中间件的用法和例子。 Downloader Middleware处理的过程主要在调度器发送requests请求的时候以及网页将respo...

2878
来自专栏网络

ASLRay:一个可以绕过ASLR的工具

ASLR(Address Space Layout Randomization,即地址空间格局随机化)是指利用随机方式配置数据地址,一般现代系统中都加设这一机制...

19610

扫描关注云+社区