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


Posted in PHP onJune 26, 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();
PHP 相关文章推荐
PHP-redis中文文档介绍
Feb 07 PHP
解析php dirname()与__FILE__常量的应用
Jun 24 PHP
一个显示效果非常不错的PHP错误、异常处理类
Mar 21 PHP
php实现扫描二维码根据浏览器类型访问不同下载地址
Oct 15 PHP
php表单提交与$_POST实例分析
Jan 26 PHP
PHP使用mysql_fetch_object从查询结果中获取对象集的方法
Mar 18 PHP
php猴子选大王问题解决方法
May 12 PHP
php 实现一个字符串加密解密的函数实例代码
Nov 01 PHP
支付宝支付开发――当面付条码支付和扫码支付实例
Nov 04 PHP
PHP get_html_translation_table()函数用法讲解
Feb 16 PHP
Laravel使用Queue队列的技巧汇总
Sep 02 PHP
laravel框架的安装与路由实例分析
Oct 11 PHP
php设计模式 Template (模板模式)
Jun 26 #PHP
php设计模式 Proxy (代理模式)
Jun 26 #PHP
php设计模式 Composite (组合模式)
Jun 26 #PHP
php设计模式 State (状态模式)
Jun 26 #PHP
php设计模式 Bridge (桥接模式)
Jun 26 #PHP
php设计模式 Chain Of Responsibility (职责链模式)
Jun 26 #PHP
php设计模式 FlyWeight (享元模式)
Jun 26 #PHP
You might like
第九节--绑定
2006/11/16 PHP
php zip文件解压类代码
2009/12/02 PHP
PHP5.3.1 不再支持ISAPI
2010/01/08 PHP
php中通过curl smtp发送邮件
2012/06/05 PHP
深入解析PHP 5.3.x 的strtotime() 时区设定 警告信息修复
2013/08/05 PHP
ini_set的用法介绍
2014/01/07 PHP
使用PHP+MySql实现微信投票功能实例代码
2017/09/29 PHP
javascript常用方法、属性集合及NodeList 和 HTMLCollection 的浏览器差异
2010/12/25 Javascript
基于jquery完美拖拽,可返回拖动轨迹
2012/03/29 Javascript
jquery中文乱码的多种解决方法
2013/06/21 Javascript
node.js cookie-parser 中间件介绍
2016/06/06 Javascript
jQuery hover事件简单实现同时绑定2个方法
2016/06/07 Javascript
原生JavaScript制作计算器
2016/10/16 Javascript
Jquery Easyui菜单组件Menu使用详解(15)
2016/12/18 Javascript
jQuery ajax动态生成table功能示例
2017/06/14 jQuery
jquery获取链接地址和跳转详解(推荐)
2017/08/15 jQuery
js原生日历的实例(推荐)
2017/10/31 Javascript
vue上传图片到oss的方法示例(图片带有删除功能)
2018/09/27 Javascript
JavaScript查看代码运行效率console.time()与console.timeEnd()用法
2019/01/18 Javascript
arctext.js实现文字平滑弯曲弧形效果的插件
2019/05/13 Javascript
JS绘图Flot应用图形绘制异常解决方案
2020/10/16 Javascript
[10:18]2018DOTA2国际邀请赛寻真——找回自信的TNCPredator
2018/08/13 DOTA
Python 常用string函数详解
2016/05/30 Python
python中json格式数据输出的简单实现方法
2016/10/31 Python
Python最火、R极具潜力 2017机器学习调查报告
2017/12/11 Python
python3使用SMTP发送HTML格式邮件
2018/06/19 Python
Python模块 _winreg操作注册表
2020/02/05 Python
关于PySnooper 永远不要使用print进行调试的问题
2021/03/04 Python
html5使用canvas实现弹幕功能示例
2017/09/11 HTML / CSS
Godiva巧克力英国官网:比利时歌帝梵巧克力
2018/08/28 全球购物
什么叫做SQL注入,如何防止
2016/10/04 面试题
一套比较完整的软件测试人员面试题
2012/05/13 面试题
美德少年事迹材料
2014/01/23 职场文书
考生诚信考试承诺书
2015/04/29 职场文书
校运会班级霸气口号
2015/12/24 职场文书
幼儿园教师辞职信
2019/06/21 职场文书