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 相关文章推荐
Apache, PHP在Windows 9x/NT下的安装与配置 (二)
Oct 09 PHP
Zend的AutoLoad机制介绍
Sep 27 PHP
CodeIgniter启用缓存和清除缓存的方法
Jun 12 PHP
浅析PHP的静态成员函数效率更高的原因
Jun 13 PHP
ThinkPHP模板自定义标签使用方法
Jun 26 PHP
phpnow php探针环境检测代码
Nov 04 PHP
php简单获取文件扩展名的方法
Mar 24 PHP
Laravel 5框架学习之Laravel入门和新建项目
Apr 07 PHP
PHP中使用curl入门教程
Jul 02 PHP
如何解决PHP无法实现多线程的问题
Sep 25 PHP
Yii 2.0中场景的使用教程
Jun 02 PHP
win7 wamp 64位 php环境开启curl服务遇到的问题及解决方法
Sep 16 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
windows下zendframework项目环境搭建(通过命令行配置)
2012/12/06 PHP
ThinkPHP模板判断输出Empty标签用法详解
2014/06/30 PHP
PHP实现多关键字加亮功能
2016/10/21 PHP
浅谈JavaScript数据类型
2015/03/03 Javascript
Bootstrap入门书籍之(四)菜单、按钮及导航
2016/02/17 Javascript
JavaScript开发者必备的10个Sublime Text插件
2016/02/27 Javascript
浅谈js停止事件冒泡 阻止浏览器的默认行为(阻止超连接 #)
2017/02/08 Javascript
又一款MVVM组件 构建自己的Vue组件(2)
2017/03/13 Javascript
Vue.js学习笔记之修饰符详解
2017/07/25 Javascript
nodejs连接mysql数据库及基本知识点详解
2018/03/20 NodeJs
layui table设置前台过滤转义等方法
2018/08/17 Javascript
VUE 解决mode为history页面为空白的问题
2019/11/01 Javascript
js实现超级玛丽小游戏
2020/03/18 Javascript
微信小程序手动添加收货地址省市区联动
2020/05/18 Javascript
在项目vue中使用echarts的操作步骤
2020/09/07 Javascript
Vue3 响应式侦听与计算的实现
2020/11/11 Javascript
[44:51]2018DOTA2亚洲邀请赛 4.4 淘汰赛 VP vs Liquid 第二场
2018/04/05 DOTA
Python实现的多线程http压力测试代码
2017/02/08 Python
Python多层装饰器用法实例分析
2018/02/09 Python
Python3 replace()函数使用方法
2018/03/19 Python
对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解
2018/06/28 Python
Python实现清理微信僵尸粉功能示例【基于itchat模块】
2020/05/29 Python
python处理写入数据代码讲解
2020/10/22 Python
马来西亚网上购物平台:ezbuy
2018/02/13 全球购物
AJAX检测用户名是否存在的方法
2021/03/24 Javascript
个人思想理论学习的自我鉴定
2013/11/30 职场文书
贺卡寄语大全
2014/04/11 职场文书
商业街策划方案
2014/05/31 职场文书
统计学教授推荐信
2014/09/18 职场文书
作风转变年心得体会
2014/10/22 职场文书
求职自荐信怎么写
2015/03/04 职场文书
收入证明申请书
2015/06/12 职场文书
2016新年感言
2015/08/03 职场文书
解决golang 关于全局变量的坑
2021/05/06 Golang
详解Vue的sync修饰符
2021/05/15 Vue.js
Django使用redis配置缓存的方法
2021/06/01 Redis