php设计模式  Command(命令模式)


Posted in PHP onJune 17, 2011

<?php
/**
* 命令模式
*
* 将一个请求封装为一个对象从而使你可用不同的请求对客户进行参数化,对请求排除或记录请求日志,以及支持可取消的操作
*/
interface Command
{
public function execute();
}

class Invoker
{
private $_command = array();
public function setCommand($command) {
$this->_command[] = $command;
}

public function executeCommand()
{
foreach($this->_command as $command)
{
$command->execute();
}
}

public function removeCommand($command)
{
$key = array_search($command, $this->_command);
if($key !== false)
{
unset($this->_command[$key]);
}
}
}

class Receiver
{
private $_name = null;

public function __construct($name) {
$this->_name = $name;
}

public function action()
{
echo $this->_name." action<br/>";
}

public function action1()
{
echo $this->_name." action1<br/>";
}
}

class ConcreteCommand implements Command
{
private $_receiver;
public function __construct($receiver)
{
$this->_receiver = $receiver;
}

public function execute()
{
$this->_receiver->action();
}
}

class ConcreteCommand1 implements Command
{
private $_receiver;
public function __construct($receiver)
{
$this->_receiver = $receiver;
}

public function execute()
{
$this->_receiver->action1();
}
}

class ConcreteCommand2 implements Command
{
private $_receiver;
public function __construct($receiver)
{
$this->_receiver = $receiver;
}

public function execute()
{
$this->_receiver->action();
$this->_receiver->action1();
}
}

$objRecevier = new Receiver("No.1");
$objRecevier1 = new Receiver("No.2");
$objRecevier2 = new Receiver("No.3");

$objCommand = new ConcreteCommand($objRecevier);
$objCommand1 = new ConcreteCommand1($objRecevier);
$objCommand2 = new ConcreteCommand($objRecevier1);
$objCommand3 = new ConcreteCommand1($objRecevier1);
$objCommand4 = new ConcreteCommand2($objRecevier2); // 使用 Recevier的两个方法

$objInvoker = new Invoker();
$objInvoker->setCommand($objCommand);
$objInvoker->setCommand($objCommand1);
$objInvoker->executeCommand();
$objInvoker->removeCommand($objCommand1);
$objInvoker->executeCommand();

$objInvoker->setCommand($objCommand2);
$objInvoker->setCommand($objCommand3);
$objInvoker->setCommand($objCommand4);
$objInvoker->executeCommand();
[/code]

PHP 相关文章推荐
PHP 出现乱码和Sessions验证问题的解决方法!
Dec 06 PHP
php Notice: Undefined index 错误提示解决方法
Aug 29 PHP
php的POSIX 函数以及进程测试的深入分析
Jun 03 PHP
纯PHP代码实现支付宝批量付款
Dec 24 PHP
PHP命名空间和自动加载类
Apr 03 PHP
PHP怎样用正则抓取页面中的网址
Aug 09 PHP
PHP CURL post数据报错 failed creating formpost data
Oct 16 PHP
PHP删除数组中指定下标的元素方法
Feb 03 PHP
php下的原生ajax请求用法实例分析
Feb 28 PHP
laravel admin实现分类树/模型树的示例代码
Jun 10 PHP
laravel开发环境homestead搭建过程详解
Jul 03 PHP
PHP引擎php.ini参数优化深入讲解
Mar 24 PHP
php学习笔记 面向对象中[接口]与[多态性]的应用
Jun 16 #PHP
php smarty 二级分类代码和模版循环例子
Jun 16 #PHP
Warning: session_destroy() : Trying to destroy uninitialized sessionq错误
Jun 16 #PHP
php中session_unset与session_destroy的区别分析
Jun 16 #PHP
不重新编译PHP为php增加openssl模块的方法
Jun 14 #PHP
php的memcached客户端memcached
Jun 14 #PHP
PHP模块 Memcached功能多于Memcache
Jun 14 #PHP
You might like
深入解析php模板技术原理【一】
2008/01/10 PHP
php下HTTP Response中的Chunked编码实现方法
2008/11/19 PHP
UTF-8正则表达式如何匹配汉字
2015/08/03 PHP
详解HTTP Cookie状态管理机制
2016/01/14 PHP
PHP经典算法集锦【经典收藏】
2016/09/14 PHP
jQuery live
2009/05/15 Javascript
jQuery 表单验证扩展(三)
2010/10/20 Javascript
JQuery UI的拖拽功能实现方法小结
2012/03/14 Javascript
Jquery实现的tab效果可以指定默认显示第几页
2013/10/16 Javascript
JS弹出层的显示与隐藏示例代码
2013/12/27 Javascript
js 数组去重的四种实用方法
2014/09/09 Javascript
浅谈Javascript如何实现匀速运动
2014/12/19 Javascript
Bootstrap编写一个在当前网页弹出可关闭的对话框 非弹窗
2016/06/30 Javascript
jQuery获取this当前对象子元素对象的方法
2016/11/29 Javascript
windows 下安装nodejs 环境变量设置
2017/02/02 NodeJs
Javascript中字符串相关常用的使用方法总结
2017/03/13 Javascript
微信小程序模板和模块化用法实例分析
2017/11/28 Javascript
vue项目中使用lib-flexible解决移动端适配的问题解决
2018/08/23 Javascript
基于layui内置模块(element常用元素的操作)
2019/09/20 Javascript
原生js+css调节音量滑块
2020/01/15 Javascript
js+canvas实现画板功能
2020/09/13 Javascript
[05:06]TI4西雅图DOTA2前线报道 海涛密探LGD训练
2014/07/09 DOTA
[48:31]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第一场 2月2日
2021/03/11 DOTA
python相似模块用例
2016/03/04 Python
Python3内置模块random随机方法小结
2019/07/13 Python
python同时替换多个字符串方法示例
2019/09/17 Python
python实现差分隐私Laplace机制详解
2019/11/25 Python
Python Selenium参数配置方法解析
2020/01/19 Python
Python绘制全球疫情变化地图的实例代码
2020/04/20 Python
快速解决pymongo操作mongodb的时区问题
2020/12/05 Python
美国学校用品、教室和教学商店:Discount School Supply
2018/04/04 全球购物
Dillard’s百货官网:Dillards.com
2018/05/26 全球购物
Vans(范斯)新西兰官方网站:美国原创极限运动品牌
2020/09/19 全球购物
2014-2015学年工作总结
2014/11/27 职场文书
使用 Apache Dubbo 实现远程通信(微服务架构)
2022/02/12 Servers
python如何将mat文件转为png
2022/07/15 Python