设计模式心得:三——命令模式

继续设计模式心得体验——命令模式。

命令模式: 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

一般在命令模式中有三个元素,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与具体实现解耦,不用管到底它是怎么实现的。

下面贴下该模式的代码:

 

代码
<?php
//抽象命令类
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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/405884.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

弱水三千 之 统计独立性、统计相关性辨析

序 在随机信号分析中&#xff0c;存在这样一个概念群&#xff1a;不相关、正交、统计独立。 当两个随机过程保持统计独立时&#xff0c;它们必然不相关&#xff1b;但反过来则不一定成立&#xff0c;即不相关的两个随机过程不一定能保持统计独立&#xff0c;唯有高斯过程才是个…

React开发(185):ant design table控制居中和宽度

{ title: 冻结金额, type: price, dataIndex: frozenAmount, align: center, width: 80 },{ title: 钱包状态, dataIndex: statusName, align: center, width: 80 },{ title: 所属商户, dataIndex: platformMerchantName, align: center, width: 80 },

[python] list元素按关键字相加减

python list中的元素按关键字相加或相减&#xff1a; # codingutf-8# 两个list按关键字相加或相减 def ListAdd(list1, list2, bAdd True):if bAdd False:list2 [(k, -v) for (k, v) in list2]d {}list0 list1 list2for (k, v) in list0:d.setdefault(k, 0) # 设置字典元…

Cisco 6509交换机两次更换sup720引擎的过程

1 更换原因 用户的一台Cisco6509交换机&#xff0c;单sup720引擎&#xff0c;使用了一年多的 时间。最近不知道为什么&#xff0c;引擎上外置CF卡的插槽&#xff0c;变形了&#xff0c;无法插入CF卡&#xff0c;只能开个case&#xff0c;作RMA。 2 第一次更换 …

LTRIM、RTRIM和TRIM在ORACLE中的用法:

From: http://www.cnblogs.com/gsk99/archive/2011/04/25/2027359.html LTRIM、RTRIM和TRIM在ORACLE中的用法&#xff1a; 1、LTRIM(C1,C2) 其中C1和C2都可以字符串&#xff0c;例如C1是Miss Liu&#xff0c;C2MisL等等。这是第一个和SQL SERVER不一样的地方。如果记得不错的话…

React开发(186):react 父调用子组件的方法

<BaseTableSearchsearchParams{baseSearchParams}onSearch{this.handleSearch}onRef{(node) > (this.searchRef node)}highSearch{true}/>

php有lambda表达式吗,Python中lambda表达式的简单介绍(附示例)

本篇文章给大家带来的内容是关于Python中lambda表达式的简单介绍(附示例)&#xff0c;有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对你有所帮助。一&#xff1a;匿名函数的定义lambda parameter_list: expression二&#xff1a;三元表达式条件为真时…

编程个人教训

Matlab 1、生成数据时&#xff0c;多重循环&#xff0c;最起码要把最里面的循环跑一遍&#xff0c;看看生成的图片&#xff0c;和label有没错。确定一下&#xff0c;然后再跑整个程序。 2、跑for循环&#xff0c;卡死在某一个数据上。可以把这个数据单独运行下看看结果 3、生成…

linux命令行快捷键

2019独角兽企业重金招聘Python工程师标准>>> 转自&#xff1a;http://os.chinaitzhe.com/linux/2008-01/119926636930912.html history 显示命令历史列表 ↑(Ctrl p) 显示上一条命令 ↓(Ctrl n) 显示下一条命令 !num 执行命令历史列表的第num条命令 !! 执行上一条…

php css布局技巧,最全的CSS开发常用技巧

css(层叠样式表)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。CSS不仅可以静态地修饰网页&#xff0c;还可以配合各种脚本语言动态地对网页各元素进行格式化。CSS 能够对网页中元素位置的排版进行像素级精确控制&…

守护(后台)进程的创建

/*功能&#xff1a;守护进程的创建后台进程的创建思想&#xff1a;首先父进程创建一个子进程&#xff0c;然后子进程杀死父进程。信号处理所有的工作由子进程来处理。 */ #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <st…

Lucene-3.0.0配置

Lucene-3.0.0配置2009-12-02 21:38一、Lucene开发环境配置step1.Lucene开发包下载step2.Java开发环境配置step3.Tomcat安装step4.Lucene开发环境配置解压下载的lucene-3.0.0.zip&#xff0c;可以看到lucene-core-3.0.0.jar和lucene-demos-3.0.0.jar这两个文件,将其解压(建议放在…

jQuery实现响应式瀑布流 - 实现灯箱效果

在这之前&#xff0c;有写过一篇关于实现瀑布流的文章&#xff0c;后期有人留言提出需要添加灯箱效果的功能&#xff0c;所以这次则讲述下如何实现此功能。由于该篇接上篇写的&#xff1a;jQuery实现响应式瀑布流效果&#xff08;jQueryflex&#xff09;_jquery瀑布流插件-CSDN…

php 特有,PHP单一入口的特有作用

在说单一入口之前&#xff0c;先说说多入口。Discuz!, PHPCMS 2008, DedeCMS 都是采用多入口的结构。多入口&#xff0c;即通过访问不同的 php 文件运行对应的功能。如&#xff1a;/index.php - 网站首页/show.php?id1 - 内容页/list.php?page2 - 列表页/login.php - 用户登录…

我的新发现:AVL树旋转的一个特性

关于AVL树旋转的代码网络上铺天盖地。 一些经典的实现方法如下&#xff1a; AVLTree SingleLeftRotation(AVLTree A) {AVLTree B A->left;A->Left B->Right;B->Right A;A->Height Max(GetHeight(A->Left), GetHeight(A->Right)) 1;B->Height Max…

VC中设置头文件的搜索路径~~

From:http://hi.baidu.com/woaimuxiaoyizhong/blog/item/cc3d260a9b75f21795ca6b2a.html 近日&#xff0c;小弟在研究UCOS VC版的时候&#xff0c;发现它的头文件并没有在当前目录下&#xff0c;却可以精确的找到。我估计一定是&#xff1a;VC编辑器早设置好了&#xff0c;早已…

真是的= =还是对linux不太了解啊

最近很无聊.....得到了3天假期~~~ 于是乎把Ubuntu10.10下载下来安装了 结果第二天root用户就登陆不上了 进入单用户模式后读shower文件发现密码那就一"!" 真是奇怪.... 之前在网上查说passwd命令没加载... 结果明明加载了 改了之后终于用上root权限了 结果又是惨…

php form validator 下单,PHP Form表单验证:PHP form validator使_php

在php网站开发建设中&#xff0c;用户注册、留言是必不可少的功能&#xff0c;用户提交的信息数据都是通过Form表单提交&#xff0c;为了保证数据的完整性、安全性&#xff0c;PHP Form表单验证是过滤数据的首要环节&#xff0c;PHP对表单提交数据的验证方式多种多样&#xff0…

云服务器,价格其实不便宜,但为什么还要用呢

2012年的时候&#xff0c;接触到云服务器&#xff0c;一心想搞个个人网站。当时&#xff0c;云服务器最低配置&#xff0c;1个月55元&#xff0c;1M带宽、1核CPU、512M内存&#xff0c;独立IP。加上&#xff0c;一些优惠&#xff0c;代金券之内的&#xff0c;1年400元左右。自认…

React开发(189):ant design textarea允许清除allowClear

<div style{{ margin: 10px 0 }}><span style{{ marginRight: 50px }}>调整原因</span><span><TextAreastyle{{ width: 55% }}placeholder"请输入调整原因"value{balancchangereason}formatter{(value) > &#xffe5; ${value}.repla…