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 相关文章推荐
Smarty安装配置方法
Apr 10 PHP
php实现的仿阿里巴巴实现同类产品翻页
Dec 11 PHP
PHP下常用正则表达式整理
Oct 26 PHP
PHP采集类snoopy详细介绍(snoopy使用教程)
Jun 19 PHP
跟我学Laravel之安装Laravel
Oct 15 PHP
php数组操作之键名比较与差集、交集赋值的方法
Nov 10 PHP
PHP魔术方法__GET、__SET使用实例
Nov 25 PHP
PHP使用内置函数生成图片的方法详解
May 09 PHP
如何离线执行php任务
Feb 21 PHP
php使用gearman进行任务分发操作实例详解
Feb 26 PHP
tp5.1 框架join方法用法实例分析
May 26 PHP
phpcmsv9.0任意文件上传漏洞解析
Oct 20 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连接SQLServer2005 的问题解决方法
2010/07/19 PHP
利用yahoo汇率接口实现实时汇率转换示例 汇率转换器
2014/01/14 PHP
使用Composer安装Yii框架的方法
2016/03/15 PHP
PHP基于swoole多进程操作示例
2019/08/12 PHP
JavaScript实际应用:innerHTMl和确认提示的使用
2006/06/22 Javascript
学习JS面向对象成果 借国庆发布个最新作品与大家交流
2009/10/03 Javascript
JavaScript具有类似Lambda表达式编程能力的代码(改进版)
2010/09/14 Javascript
理解Javascript_11_constructor实现原理
2010/10/18 Javascript
JQuery扩展插件Validate 2通过参数设置验证规则
2011/09/05 Javascript
深入了解javascript中的prototype与继承
2013/04/14 Javascript
node.js中的fs.lstatSync方法使用说明
2014/12/16 Javascript
深入理解JavaScript系列(29):设计模式之装饰者模式详解
2015/03/03 Javascript
jQuery页面刷新(局部、全部)问题分析
2016/01/09 Javascript
关于JavaScript 原型链的一点个人理解
2016/07/31 Javascript
又一款MVVM组件 构建自己的Vue组件(2)
2017/03/13 Javascript
基于angular实现模拟微信小程序swiper组件
2017/06/11 Javascript
Vue单文件组件基础模板小结
2017/08/10 Javascript
node简单实现一个更改头像功能的示例
2017/12/29 Javascript
vue引入新版 vue-awesome-swiper插件填坑问题
2018/01/25 Javascript
微信小程序页面缩放式侧滑效果的实现代码
2018/11/15 Javascript
js指定日期增加指定月份的实现方法
2018/12/19 Javascript
Vue如何循环提取对象数组中的值
2020/11/18 Vue.js
Python导入txt数据到mysql的方法
2015/04/08 Python
Python编程pygame模块实现移动的小车示例代码
2018/01/03 Python
Python编程实现从字典中提取子集的方法分析
2018/02/09 Python
python中正则表达式的使用方法
2018/02/25 Python
Django models filter筛选条件详解
2020/03/16 Python
详解django使用include无法跳转的解决方法
2020/03/19 Python
使用Python封装excel操作指南
2021/01/29 Python
平安校园建设方案
2014/05/02 职场文书
电力培训心得体会
2014/09/02 职场文书
常务副总经理岗位职责
2015/02/02 职场文书
大学生十八大感想
2015/08/11 职场文书
自愿离婚协议书范本2016
2016/03/18 职场文书
vue里使用create, mounted调用方法
2022/04/26 Vue.js
vue css 相对路径导入问题级踩坑记录
2022/06/05 Vue.js