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

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

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

一般在命令模式中有三个元素,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,一经查实,立即删除!

相关文章

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

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

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 能够对网页中元素位置的排版进行像素级精确控制&…

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

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

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

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

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

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

[Objective-c 基础 - 1.3] OC带返回值的类方法

1 /*2 计算器类3 1>返回π4 2>计算两个整数的平方5 3>计算两个整数的和6 */7 8 9 #import <Foundation/Foundation.h> 10 11 interface Calculator: NSObject 12 //方法名:pi 13 - (double) pi; 14 15 //OC方法中&#xff0c;一个参数对应一个冒号: 16 /…

php 最后几个字符,php怎么去掉最后三个字符

在php中&#xff0c;可以利用substr()函数来去掉字符串最后三个字符&#xff0c;该函数可以返回字符串的一部分&#xff1b;具体语法格式为“substr(指定字符串,0,-3)”。本教程操作环境&#xff1a;windows7系统、PHP7.1版&#xff0c;DELL G3电脑php去掉字符串最后三个字符he…

深入react技术栈(12):组件内通信

我是歌谣 放弃很容易 但是坚持一定很酷 微信公众号关注前端小歌谣获取前后端知识 父组件向子组件传值 子组件向父组件传值 跨级组件通信 没有嵌套关系的组件通信 文章参考深入React技术栈

《迷宫》之站立会议—5.15

会议时间&#xff1a;7:10 内容&#xff1a; 还没怎么做&#xff0c;组长有些着急&#xff0c;表示快快做。 转载于:https://www.cnblogs.com/little-clever/p/4505113.html

C#中使用post请求方法请求表单-用于两个网站的交互

网站A中的后台代码&#xff1a; 1 //请求的URL2 HttpWebRequest request WebRequest.Create("http://192.168.1.132:86/test01.aspx") as HttpWebRequest;3 request.Method "po…

Samba服务器(一):windows访问samba服务器共享文件的简单实现(图文并茂)

From:http://linux.chinaunix.net/techdoc/beginner/2009/07/09/1122864.shtml 一、linux的文件共享&#xff08;当然也包括和windows进行文件共享&#xff09;一般有NFS, FTP, SSH SAMB等&#xff0c;但是以samba最为普遍和流行。下面就对samba服务器做个全面的介绍和讲解&…

python 3.9特性,开发者应该知道的Python 3.9新特性

导读&#xff1a;Python 3.9来了&#xff0c;有哪些新特性值得学&#xff0c;值得用&#xff1f;Python 2.9(5.10.2020)已经发布了一段时间&#xff0c;最后一个Alpha版(3.9.0a5)近期发布了测试版。开发者应该看新版有哪些新功能&#xff0c;改进和修复。安装测试版本节尝鲜安装…

python一维数组定义,python一维数组保存

python中向一维数组添加元素的方法例如爬虫爬取到的数据只有[b11dab7a2f48d131fc9c26678636294381aedd41&#xff0c;供参考&#xff1a; old_array [b11dab7a2f48d131fc9c26678636294381aedd41, 5183353435e0a7b1681010bd71d3d7791492685e]new_array [magnet:?xturn:btih: …

mount NTFS FOR RHEL5

2019独角兽企业重金招聘Python工程师标准>>> USB的支持关键在于驱动&#xff0c;没有驱动设备时mount执行是肯定不成的。 1. 先别插U盘&#xff0c;/sbin/lsmod看是否有usb-storage。如果没有的话&#xff1a; cd /lib/modules/2.4.20-8/kernel/drivers/usb for v i…

[C1] 优化 C1FlexGrid 单元格边框

一 优化理由 如下图所示&#xff0c;如果按照 C1FlexGrid 自带的单元格边框设置&#xff0c;即对每个单元格的 CellStyle 的 BorderThickness 进行设置&#xff0c;会得到如下图的效果&#xff1a; 其中&#xff0c;明显可以看到如果两个相邻的单元格同时设置了那条相邻的边&a…

Source Insight经典教程

From: http://blog.21ic.com/user1/4251/archives/2008/53650.html Source Insight实质上是一个支持多种开发语言&#xff08;java,c ,c 等等&#xff09;的编辑器&#xff0c;只不过由于其查找、定位、彩色显示等功能的强大&#xff0c;常被我们当成源代码阅读工具使用。 作…