php设计模式.chm,php设计模式 Command(命令模式)

本文为大家讲解的是php设计模式 中的 Command(命令模式)示例,感兴趣的同学参考下。

将一个请求封装为一个对象从而使你可用不同的请求对客户进行参数化,对请求排除或记录请求日志,以及支持可取消的操作

/**

* 命令模式

*

* 将一个请求封装为一个对象从而使你可用不同的请求对客户进行参数化,对请求排除或记录请求日志,以及支持可取消的操作

*/

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
";

}

public function action1()

{

echo $this->_name." action1
";

}

}

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]

导言 当你在不断的试图从你的应用程序中发现新的特征时,你是否发现你提出的解决方法和一些以前你已经实现的东西是如此的类似呢?如果你是一个程序员(即使你才 开始很短的时间),你都可能回答“是”。这看起来就是你使用了一些以前的代码来解决软件开发过程中新发现的问题了。你可能已经认识到:你的解决方法是基本 原理,是一个不仅仅是你而且是所有专业开发者都能广泛重复应用的方法。 事实上,许多程序问题都不断的反复的遇到,而且许多用来解决这些问题的基本方法(或者说是设计模式)都已经浮现出来。设计模式就是一个教你如何利用真实可靠的设计来组织你的代码的模板。 设计模式历史 “设计模式”这个术语最初被设计用于建筑学领域。Christopher Alexander 在他1977的著作“A Pattern Language :Towns/Building/Construction”里面描述了一些常见的建筑学设计问题,并解释了如何用这些已有的,著名的模式集合来开始全新 的有效的设计。Alexander的观点被很好的转化到软件开发上来,并且长期的合意的用原有的组件来构造新的解决方案。 所有的设计模式都有一些常用的特性:一个标识(a name),一个问题陈述(a problem statement)和一个解决方案(a solution)。 1、一个设计模式的标识是重要的,因为它会让其他的程序员不用进行太深入的学习就能立刻理解你的代码的目的(至少通过这个标识程序员会很熟悉这个模式)。? 2、问题描述是用来说明这个模式的应用的领域。? 3、解决方案描述了这个模型的执行。一个好的设计模式的论述应该覆盖使用这个模型的优点和缺点。? 一个模式是解决特定问题的有效方法。一个设计模式不是一个库(能在你的项目中直接包含和使用的代码库)而是一个用来组织你的代码的模板。事实上,一个代码库和一个设计模式在应用上是有很多不同的。 比如,你从店铺里面买的一件衬衫是一个代码库,它的颜色,样式和大小都由设计师和厂商决定,但它满足了你的需求。 然而,如果店里面没有什么衣服适合你,那你就能自己创建自己的衬衫(设计它的形状,选择布料,然后裁缝在一起)。但是如果你不是一个裁缝,你可能会发现自 己很容易的去找一个合适的模式然后按着这个模式去设计自己的衬衫。使用一个模型,你可以在更少的时间内得到一个熟练设计的衬衫。 回到讨论软件上来,一个数据提取层或者一个CMS(content management system)就是一个库——它是先前设计好而且已经编码好了的,如果它能准确的满足你的需要那它就是一个好的选择。但如果你正在读这本书,可能你会发现 库存的(原有的)解决方案并不是总是对你有效。至今你知道什么是你所要的,而且你能够实现它,你仅仅需要一个模型来引导你。 最后一个想法:就象一个裁缝模型,一个设计本身而言是没有什么用处的。毕竟,你不可能穿一个服装模型——它仅仅是由很薄的纸拼凑起来的。类似的,一个软件设计模型也仅仅只是一个引导。它必须根据程序设计语言和你的应用程序的特点和要求而特别的设计。 本书的目标 本书的目的不是为了全面的介绍各种类别的软件设计模式,也不是为了发展一个新的设计模式或者术语,而是为了突出介绍一些已有的著名的设计模式。这本书的 独特之处在于介绍了一些我认为对开发动态WEB应用程序很有帮助的设计模式,而且用PHP语言显示了如何实现这些设计模式。 面对对象编程OOP 这本书一个优点就是所有的观点都是基于OOP这种很自然的设计模式,并且用OOP来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值