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 相关文章推荐
让你的网站首页自动选择语言转跳
Dec 06 PHP
ADODB的数据库封包程序库
Dec 31 PHP
PHP 数组实例说明
Aug 18 PHP
PHP错误抑制符(@)导致引用传参失败Bug的分析
May 02 PHP
php各种编码集详解和以及在什么情况下进行使用
Sep 11 PHP
浅析SVN常见问题及解决方法
Jun 21 PHP
php构造函数实例讲解
Nov 13 PHP
yii2整合百度编辑器umeditor及umeditor图片上传问题的解决办法
Apr 20 PHP
php插入mysql数据返回id的方法
May 31 PHP
php微信公众号开发之答题连闯三关
Oct 20 PHP
PHP实现本地图片转base64格式并上传
May 29 PHP
phpstorm激活码2020附使用详细教程
Sep 25 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
PHPlet在Windows下的安装
2006/10/09 PHP
PHP静态新闻列表自动生成代码
2007/06/14 PHP
PHP 网络开发详解之远程文件包含漏洞
2010/04/25 PHP
php实现有序数组旋转后寻找最小值方法
2018/09/27 PHP
php设计模式之策略模式应用案例详解
2019/06/17 PHP
通过身份证号得到出生日期和性别的js代码
2009/11/23 Javascript
jQuery 动画弹出窗体支持多种展现方式
2010/04/29 Javascript
jquery实现点击弹出层效果的简单实例
2014/03/03 Javascript
javascript内置对象arguments详解
2014/03/16 Javascript
js操作输入框中选择内容兼容IE及其他主流浏览器
2014/04/22 Javascript
javascript面向对象程序设计(一)
2015/01/29 Javascript
JS+CSS实现鼠标滑过时动态翻滚的导航条效果
2015/09/24 Javascript
jquery获取下拉框中的循环值
2017/02/08 Javascript
用最简单的方法判断JavaScript中this的指向(推荐)
2017/09/04 Javascript
vue中实现滚动加载更多的示例
2017/11/08 Javascript
JS操作字符串转数字的常见方法示例
2019/10/29 Javascript
js+html实现点名系统功能
2019/11/05 Javascript
微信小程序实现星星评分效果
2020/11/01 Javascript
如何基于viewport vm适配移动端页面
2020/11/13 Javascript
JS闭包原理及其使用场景解析
2020/12/03 Javascript
一文秒懂nodejs中的异步编程
2021/01/28 NodeJs
Python 自动化表单提交实例代码
2017/06/08 Python
使用Python调取任意数字资产钱包余额功能
2019/08/15 Python
解决Python使用列表副本的问题
2019/12/19 Python
Spring http服务远程调用实现过程解析
2020/06/11 Python
即兴演讲稿
2014/01/04 职场文书
预备党员思想汇报范文
2014/01/11 职场文书
电力培训心得体会
2014/09/02 职场文书
学习教师敬业奉献模范事迹材料思想汇报
2014/09/19 职场文书
2015幼儿园庆元旦活动方案
2014/12/09 职场文书
优秀共产党员事迹材料
2014/12/18 职场文书
让生命充满爱观后感
2015/06/08 职场文书
教师正风肃纪心得体会
2016/01/15 职场文书
SQL Server中交叉联接的用法详解
2021/04/22 SQL Server
css3 利用transform-origin 实现圆点分布在大圆上布局及旋转特效
2021/04/29 HTML / CSS
JS前端使用canvas实现扩展物体类和事件派发
2022/08/05 Javascript