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实现 使用PHP数组内部指针操作函数
Oct 12 PHP
服务器web工具 php环境下
Dec 29 PHP
Session的工作机制详解和安全性问题(PHP实例讲解)
Apr 10 PHP
thinkphp文件处理类Dir.class.php的用法分析
Dec 08 PHP
php连接微软MSSQL(sql server)完全攻略
Nov 27 PHP
PHP会话控制实例分析
Dec 24 PHP
php实现自定义中奖项数和概率的抽奖函数示例
May 26 PHP
PHP十六进制颜色随机生成器功能示例
Jul 24 PHP
php对微信支付回调处理的方法
Aug 23 PHP
Laravel框架验证码类用法实例分析
Sep 11 PHP
Yii框架应用组件用法实例分析
May 15 PHP
如何用Laravel包含你自己的帮助函数
May 27 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
完美实现GIF动画缩略图的php代码
2011/01/02 PHP
PHP实现的带超时功能get_headers函数
2015/02/10 PHP
php实现购物车功能(以大苹果购物网为例)
2017/03/09 PHP
[原创]PHP正则删除html代码中a标签并保留标签内容的方法
2017/05/23 PHP
网页里控制图片大小的相关代码
2006/06/13 Javascript
jQuery 操作下拉列表框实现代码
2010/02/22 Javascript
JavaScript入门之事件、cookie、定时等
2011/10/21 Javascript
javascript使用正则表达式检测IP地址
2014/12/03 Javascript
node.js中的console.assert方法使用说明
2014/12/10 Javascript
jQuery通过控制节点实现仅在前台通过get方法完成参数传递
2015/02/02 Javascript
jquery ztree异步搜索(搜叶子)实践
2016/02/25 Javascript
nodeJs内存泄漏问题详解
2016/09/05 NodeJs
解决vue+webpack打包路径的问题
2018/03/06 Javascript
VUE实现可随意拖动的弹窗组件
2018/09/25 Javascript
vue cli3.0结合echarts3.0与地图的使用方法示例
2019/03/26 Javascript
nodejs实现的http、https 请求封装操作示例
2020/02/06 NodeJs
javascript设计模式 ? 桥接模式原理与应用实例分析
2020/04/13 Javascript
Vue实现简单购物车功能
2020/12/13 Vue.js
python中二维阵列的变换实例
2014/10/09 Python
Python中的元类编程入门指引
2015/04/15 Python
python类和继承用法实例
2015/07/07 Python
Python 的描述符 descriptor详解
2016/02/27 Python
浅谈python对象数据的读写权限
2016/09/12 Python
Python实现自动为照片添加日期并分类的方法
2017/09/30 Python
下载python中Crypto库报错:ModuleNotFoundError: No module named ‘Crypto’的解决
2018/04/23 Python
python requests爬取高德地图数据的实例
2018/11/10 Python
python实现将多个文件分配到多个文件夹的方法
2019/01/07 Python
Django web框架使用url path name详解
2019/04/29 Python
记录模型训练时loss值的变化情况
2020/06/16 Python
python 如何调用 dubbo 接口
2020/09/24 Python
数字漫画:comiXology
2020/06/13 全球购物
一套C++笔试题面试题
2012/06/06 面试题
同步和异步有何异同,在什么情况下分别使用他们?
2012/12/28 面试题
运动会通讯稿200字
2014/02/16 职场文书
2014年酒店工作总结范文
2014/11/17 职场文书
Python图像处理之图像拼接
2021/04/28 Python