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 相关文章推荐
PHP insert语法详解
Jun 07 PHP
php下过滤html代码的函数 提高程序安全性
Mar 02 PHP
Base64在线编码解码实现代码 演示与下载
Jan 08 PHP
C#静态方法与非静态方法实例分析
Sep 22 PHP
20个2014年最优秀的PHP框架回顾
Oct 22 PHP
php修改上传图片尺寸的方法
Apr 14 PHP
php示例详解Constructor Prototype Pattern 原型模式
Oct 15 PHP
10款实用的PHP开源工具
Oct 23 PHP
composer.lock文件的作用
Feb 03 PHP
php文件上传后端处理小技巧
May 22 PHP
PHP函数rtrim()使用中的怪异现象分析
Feb 24 PHP
微信小程序发送订阅消息的方法(php 为例)
Oct 30 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的一些小问题
2010/07/03 PHP
基于php使用memcache存储session的详解
2013/06/25 PHP
php利用fsockopen GET/POST提交表单及上传文件
2017/05/22 PHP
php+ajax实现异步上传文件或图片功能
2017/07/18 PHP
PHP针对伪静态的注入总结【附asp与Python相关代码】
2017/08/01 PHP
关于Curl在Swoole协程中的解决方案详析
2019/09/12 PHP
swoole锁的机制代码实例讲解
2021/03/04 PHP
html下载本地
2006/06/19 Javascript
JAVASCRIPT HashTable
2007/01/22 Javascript
javascript自执行函数之伪命名空间封装法
2010/12/25 Javascript
JavaScript学习笔记记录我的旅程
2012/05/23 Javascript
JavaScript实现的字符串replaceAll函数代码分享
2015/04/02 Javascript
javascript实现在网页任意处点左键弹出隐藏菜单的方法
2015/05/13 Javascript
Underscore源码分析
2015/12/30 Javascript
select隐藏选中值对应的id,显示其它id的简单实现方法
2016/08/25 Javascript
浅析 NodeJs 的几种文件路径
2017/06/07 NodeJs
JavaScript 自定义事件之我见
2017/09/25 Javascript
vue2.0设置proxyTable使用axios进行跨域请求的方法
2017/10/19 Javascript
详解RequireJs官方使用教程
2017/10/31 Javascript
详解webpack引用jquery(第三方模块)的三种办法
2019/08/21 jQuery
[02:36]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma 选手采访
2021/03/11 DOTA
Python中集合类型(set)学习小结
2015/01/28 Python
解决pyqt5中QToolButton无法使用的问题
2019/06/21 Python
创建Shapefile文件并写入数据的例子
2019/11/26 Python
python利用google翻译方法实例(翻译字幕文件)
2020/09/21 Python
Python 的 f-string 可以连接字符串与数字的原因解析
2021/02/20 Python
C#实现启动一个进程
2016/10/01 面试题
学校党的群众路线教育实践活动总结报告
2014/07/03 职场文书
革命英雄事迹演讲稿
2014/09/13 职场文书
幼儿园小班教师个人工作总结
2015/02/06 职场文书
绿色环保倡议书
2015/04/28 职场文书
2015年幼儿园德育工作总结
2015/05/25 职场文书
幼儿园春季开学通知
2015/07/16 职场文书
详解MySQL 用户权限管理
2021/04/20 MySQL
Go语言中break label与goto label的区别
2021/04/28 Golang
聊聊mysql都有哪几种分区方式
2022/04/13 MySQL