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

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

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

一、概念

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

相关文章

来自专栏陈仁松博客

ASP.NET Core 'Microsoft.Win32.Registry' 错误修复

今天在发布Asp.net Core应用到Azure的时候出现错误InvalidOperationException: Cannot find compilati...

4798
来自专栏张善友的专栏

Mix 10 上的asp.net mvc 2的相关Session

Beyond File | New Company: From Cheesy Sample to Social Platform Scott Hansel...

2517
来自专栏杨龙飞前端

scrollto 到指定位置

2484
来自专栏一个爱瞎折腾的程序猿

sqlserver使用存储过程跟踪SQL

USE [master] GO /****** Object: StoredProcedure [dbo].[sp_perfworkload_trace_s...

1990
来自专栏跟着阿笨一起玩NET

c#实现打印功能

2612
来自专栏张善友的专栏

Silverlight + Model-View-ViewModel (MVVM)

     早在2005年,John Gossman写了一篇关于Model-View-ViewModel模式的博文,这种模式被他所在的微软的项目组用来创建Expr...

2898
来自专栏张善友的专栏

LINQ via C# 系列文章

LINQ via C# Recently I am giving a series of talk on LINQ. the name “LINQ via C...

2605
来自专栏张善友的专栏

Miguel de Icaza 细说 Mix 07大会上的Silverlight和DLR

Mono之父Miguel de Icaza 详细报道微软Mix 07大会上的Silverlight和DLR ,上面还谈到了Mono and Silverligh...

2667
来自专栏pangguoming

Spring Boot集成JasperReports生成PDF文档

由于工作需要,要实现后端根据模板动态填充数据生成PDF文档,通过技术选型,使用Ireport5.6来设计模板,结合JasperReports5.6工具库来调用渲...

1.2K7
来自专栏魂祭心

原 canvas绘制clock

4004

扫码关注云+社区