设计模式心得:三——命令模式
继续设计模式心得体验——命令模式。
命令模式: 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
一般在命令模式中有三个元素,invoker、command、receive。command 是一个抽象类或者也可以是个接口,它封装了一个execute方法,一般在command初始化的时候接受一个receive参数,而execute就是执行该receive的某些方法。invoker是请求者,它自身可以存储一个或者一组command的子类,然后在某种情况下按顺序执行这些command的execute方法。当然你也就可以记录下这些命令,或者撤销。invoker就不需要知道receive怎么做的它只需要知道command有execute方法就行了,不管它是怎么做的,这样就和receive解耦了。
在生活中的命令模式很多,比如你去餐馆吃饭,服务员给你拿了菜单,你写下几个菜,服务员将你点的菜记下来,然后交给厨师去做,在这其中,服务员就扮演invoker的角色,他不需要知道厨师怎么烧菜的,他只要将订单(command组)交给厨师就好。
命令模式一般被用来解决类似队列,记录日志,有撤销操作等类型的问题,invoker是这个核心,它能保证命令的有序执行并且可以记录下他们或者撤销操作,而不需要管这些命令是什么,只要是继承了command命令就行。
从这个模式中我学到了,封装的好处和抽象(或者说接口),用抽象或者接口定义的execute保证了invoker每次调用command的子类时execute都不会出错,所以invoker可以保证队列,日志的正常运行或撤销,而封装好了的execute方法让invoker与具体实现解耦,不用管到底它是怎么实现的。
下面贴下该模式的代码:
//抽象命令类
abstract class Command {
protected $_r;
public function __construct(Receiver $r)
{
$this->_r = $r;
}
abstract public function execute();
}
//接受命令者(真正的执行者)
class Receiver {
private $_name;
//这里初始化不同的接受者
function __construct($name)
{
$this->_name = $name;
}
function kaoyrc()
{
echo $this->_name . '在烤羊肉串<br />';
}
function kaojc()
{
echo $this->_name . '在烤鸡翅<br />';
}
}
class Invoker {
private $_commands = array();
function setCommand(Command $cmd)
{
$this->_commands[] = $cmd;
}
function execute()
{
foreach ($this->_commands as $cmd)
{
$cmd->execute();
}
}
}
//这个是烤羊肉串的命令
class kaoyrcCommand extends Command {
public function execute()
{
$this->_r->kaoyrc();
}
}
//这个是考鸡翅的命令
class kaojcCommand extends Command {
public function execute()
{
$this->_r->kaojc();
}
}
$zs = new Receiver('张三'); //初始化接受者张三
$ls = new Receiver('李四'); //初始化接受者李四
$waiter = new Invoker(); //创建服务员
$zskaoyrc = new kaoyrcCommand($zs); //创建让张三烤羊肉串的命令
$zskaojc = new kaojcCommand($zs); //创建让张三烤鸡翅的命令
$lskaojc = new kaojcCommand($ls); //创建让李四烤鸡翅的命令
//将命令报给服务员让他处理
$waiter->setCommand($zskaoyrc);
$waiter->setCommand($zskaojc);
$waiter->setCommand($lskaojc);
$waiter->execute(); //将命令组报给接受者(解决者)
?>
// 结果
// 张三在烤羊肉串
// 张三在烤鸡翅
// 李四在烤鸡翅
转载于:https://www.cnblogs.com/cl51287/archive/2010/10/14/1851703.html
设计模式心得:三——命令模式相关推荐
- 【白话设计模式八】命令模式(Command)
为什么80%的码农都做不了架构师?>>> #0 系列目录# 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二] ...
- Head First 设计模式中的命令模式 的一个错误
最近在看Head First 设计模式,其中命令模式中有讲到实现撤销功能,并且作者还出了一道题, 下面的是书中习题: public class MarcoCommand implements Comm ...
- Head First 设计模式总结(六) 命令模式
本文总结了<Head First 设计模式>中的命令模式 命令模式--将请求封装成"对象",以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也支持撤销操作. ...
- 【源码分析设计模式 13】命令模式
一.基本介绍 1.在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作时哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计 ...
- 设计模式笔记:命令模式
首先看看命令模式的定义:命令模式将请求封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也支持撤销的操作. 所谓参数化,我的理解是实际执行的对象,比如light(电灯).strer ...
- Java描述设计模式(20):命令模式
本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景 1.场景描述 智能电脑的品牌越来越多,由此诞生了一款电脑控制的APP,万能遥控器,用户在使用遥控器的时候,可以切换为自家电视的品 ...
- [设计模式-行为型]命令模式(Command)
一句话 命令的请求和命令的执行用不同的对象表示.(好处是可以独立开发,也可以进行撤销) 概括 解析 COMMAND-俺有一个MM家里管得特别严,没法见面,只好借助于她弟弟在我们俩之间传送信息,她对我有 ...
- 《设计模式》之命令模式
一.命令模式定义 命令大家都不会陌生,那么在开始命令模式之前,可以想象一下生活中的命令模式的特点: 如老板命令你完成一个OA项目是一个命令,接着看看其特点: 1.在上面的命令中,命令的执行者肯定是聪明 ...
- 设计模式之禅-命令模式
目录 命令模式 例子 定义 优点 缺点 使用场景 扩展 增加需求 回滚 完美的Command 命令模式 例子 外包甲方项目..刚开始,客户(也就是旅行社,甲方)很乐意和我们每个组探讨,比如和需求组讨论 ...
最新文章
- 在Rust代码中编写Python是种怎样的体验?
- 迁移学习之VGG16和VGG19
- 【FFmpeg】FFmpeg 相关术语简介 ( 容器 | 媒体流 | 数据帧 | 数据包 | 编解码器 | 复用 | 解复用 )
- PostgreSQL入门篇学习笔记(七)
- 红帽JBoss BRMS和BPMS富客户端框架展示了与GWT / Errai / UberFire和AngularJS的多语言集成...
- LeetCode 697. 数组的度
- MongoDB (六) MongoDB 集合操作
- python做excel自动化-用Python控制Excel实现自动化办公,手把手教你
- Codeforces Round #666 (Div. 2)D. Stoned Game(博弈问题)
- 怎么寻找java实例,Java 实例 – 在指定目录中查找文件
- 地理空间数据云下载遥感影像
- 安卓改机,改串的研究
- SRGAN-超分辨率图像复原
- 天刀霸王枪服务器怎么维护了,霸王枪27日合服 11批天涯合服维护公告
- 全网最详细!vue中使用flv.js 播放直播监控视频流
- 天猫魔盒部分adb shell或telnet下有用命令
- Android实践:做一个可视频交互的智能小车
- 怎样分析数据致提高产出?(三)
- JavaScript 数组塌陷
- K8s工作负载原理剖析和体验-杜军-专题视频课程