声明:本系列博客参考资料《大话设计模式》,作者程杰。

命令模式:在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,实现二者之间的松耦合。这就是命令模式。

类图:

角色分析:

抽象命令定义命令的接口,声明执行的方法。

具体命令命令接口实现对象,是“虚”的实现;通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。

命令接收者接收者,真正执行命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。

控制者要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。这个是客户端真正触发命令并要求命令执行相应操作的地方,也就是说相当于使用命令对象的入口。

核心代码:

<?php
/*** Created by PhpStorm.* User: LYL* Date: 2015/6/4* Time: 20:21*//*** 电视机是请求的接收者,
*遥控器上有一些按钮,不同的按钮对应电视机的不同操作。
*抽象命令角色由一个命令接口来扮演,有三个具体的命令类实现了抽象命令接口,
*这三个具体命令类分别代表三种操作:打开电视机、关闭电视机和切换频道。
*显然,电视机遥控器就是一个典型的命令模式应用实例。*//**命令接收者* Class Tv*/
class Tv
{public $curr_channel=0;/*** 打开电视机*/public function turnOn(){echo "The television is on."."<br/>";}/*** 关闭电视机*/public function turnOff(){echo "The television is off."."<br/>";}/**切换频道* @param $channel    频道*/public function turnChannel($channel){$this->curr_channel=$channel;echo "This TV Channel is ".$this->curr_channel."<br/>";}
}/**执行命令接口* Interface ICommand*/
interface ICommand
{function execute();
}/**开机命令* Class CommandOn*/
class CommandOn implements  ICommand
{private $tv;public function __construct($tv){$this->tv=$tv;}public function execute(){$this->tv->turnOn();}
}/**关机命令* Class CommandOn*/
class CommandOff implements  ICommand
{private $tv;public function __construct($tv){$this->tv=$tv;}public function execute(){$this->tv->turnOff();}
}/**切换频道命令* Class CommandOn*/
class CommandChannel implements  ICommand
{private $tv;private $channel;public function __construct($tv,$channel){$this->tv=$tv;$this->channel=$channel;}public function execute(){$this->tv->turnChannel($this->channel);}
}/**遥控器* Class Control*/
class Control
{private $_onCommand;private $_offCommand;private $_changeChannel;public function __construct($on,$off,$channel){$this->_onCommand = $on;$this->_offCommand = $off;$this->_changeChannel = $channel;}public function turnOn(){$this->_onCommand->execute();}public function  turnOff(){$this->_offCommand->execute();}public function changeChannel(){$this->_changeChannel->execute();}
}

调用客户端代码:

header("Content-Type:text/html;charset=utf-8");
//----------------------命令模式--------------------
require_once "./Command/Command.php";
//测试代码
// 命令接收者  
$myTv = new Tv();
// 开机命令  
$on = new CommandOn($myTv);
// 关机命令  
$off = new CommandOff($myTv);// 频道切换命令  
$channel = new CommandChannel($myTv, 2);
// 命令控制对象 
$control = new Control($on, $off, $channel);
// 开机  
$control->turnOn();
// 切换频道  
$control->changeChannel();
// 关机  
$control->turnOff();

适用场景:

1.系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。

2.系统需要在不同的时间指定请求、将请求排队和执行请求。

3.系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作。

4.系统需要将一组操作组合在一起,即支持宏命令。

优点

1.降低对象之间的耦合度。

2.新的命令可以很容易地加入到系统中。

3.可以比较容易地设计一个组合命令。

4.调用同一方法实现不同的功能

缺点

使用命令模式可能会导致某些系统有过多的具体命令类。因为针对每一个命令都需要设计一个具体命令类,因此某些系统可能需要大量具体命令类,这将影响命令模式的使用。

欢迎关注我的视频课程,地址如下,谢谢。
PHP面向对象设计模式

PHP设计模式——命令模式相关推荐

  1. Python设计模式-命令模式

    Python设计模式-命令模式 代码基于3.5.2,代码如下; #coding:utf-8 #命令模式class barbecuer():def bakeButton(self):print(&quo ...

  2. 设计模式 命令模式 实例_根据您的命令-命令设计模式

    设计模式 命令模式 实例 命令设计模式是一种广为人知的设计模式,属于行为设计模式("四人帮"的一部分). 顾名思义,它与应用程序中的动作和事件有关. 问题陈述: 假设有一个网页将在 ...

  3. C语言设计模式——命令模式

    C语言设计模式--命令模式 好处:让代码清晰明了,容易添加和删除,易维护. 哪些地方会用到命令模式?(列出几个常见的例子) 1.按键处理,每个按键按下得到一个索引(指的就是命令),一个按键对应一个处理 ...

  4. C语言实现设计模式—命令模式

    文章目录 C语言设计模式--命令模式 传统的实现方式如下:(伪代码) 命令模式优化 UML 用例说明 实现流程 command.h command.c main 总结 C语言设计模式--命令模式 好处 ...

  5. 游戏设计模式 - 命令模式在Unity中的应用(C#)

    游戏设计模式 - 命令模式在Unity中的应用(C#) 实测:这是一篇简单易懂的文章-> https://zhuanlan.zhihu.com/p/46937284

  6. C++设计模式——命令模式(command pattern)

    一.原理讲解 别名动作(action),事务(transaction). 1.1意图 将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作 ...

  7. [Head First设计模式]餐馆中的设计模式——命令模式

    系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 [Head First设计模式]山西面馆中的设计模式- ...

  8. 小菜学设计模式——命令模式

    2019独角兽企业重金招聘Python工程师标准>>> 背景 外面小摊与店面的比较,你就会发现,店面似乎更加容易管理,为什么呢?因为在客户与老板自己新增了很多员工,这些员工各司其职, ...

  9. 设计模式 命令模式 之 管理智能家电

    继续设计模式哈,今天带来命令模式,二话不说,先看定义: 定义:将"请求"封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也支持可撤销的操作. 这尼玛定义,看得 ...

  10. 设计模式- 命令模式

    Gof定义 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤销的操作. 理解 对命令模式我有一些肤浅的认识,也许是不对的.但我还是写一下.其实在 ...

最新文章

  1. 如何安装适用于Python的yaml软件包?
  2. MoCo论文中的Algorithm 1伪代码解读
  3. thinkphp验证是否登录并跳转
  4. 【大总结1】数据结构与传统算法总结
  5. 新星计划·第三季【博文流量密码公开课】
  6. java application_applet_Java程序可以分为JavaApplication和JavaApplet两类。()
  7. 【连载】【FPGA黑金开发板】Verilog HDL那些事儿--数码管电路驱动(八)
  8. C#获取MySql 数据常用的代码
  9. 在OSPF网络中,如何判断LSA的新旧?
  10. 如何获得更多表情包_从资产商店获得更多
  11. matlab绘制符号函数的ezplot函数
  12. 万年历的实现——C++Java版
  13. 跳妹儿学编程之ScratchJr(五):ScratchJr入门程序积木块功能介绍与使用技巧
  14. 红米note4x装linux,红米Note4X自己安装Magisk的过程
  15. 增长黑客手册:如何用数据驱动爆发式增长_思维导图
  16. crontab shell 每5秒执行_shell之定时周期性执行脚本-crontab
  17. 5 坐标变换与视觉测量
  18. Vue3集成富文本编辑器TinyMce6
  19. IT行业HR人事面试题
  20. windows7系统损坏修复_UEFI?安装纯净的 Windows 7/10 系统

热门文章

  1. java插件开发_编写一个IDEA插件之:自动生成Java代码
  2. matlab slope函数,Matlab常用函数汇总
  3. 功能测试常用6种方法_云端功能测试:更好的12种方法
  4. TED 演讲 How we can control the coronavirus pandemic? 我们如何控制新冠病毒的传播 ?
  5. 蓝牙 查询码 android,android bluetooth UUID蓝牙查询表
  6. 使用R的金融统计:收益、随机行走和模拟
  7. 网站用户的生命周期价值
  8. 数据结构题及c语言版4.31答案,数据结构参考题及答案修正版.doc
  9. spring boot rabbitmq_Spring Boot2(十):RabbitMQ 详解
  10. 评分卡模型开发(七)--基于逻辑回归的标准评分卡实现