PHP设计模式-观察者模式 Observer

PHP观察者设计模式(Observer)又被为发布订阅模式(publish/subscribe)或丛属者模式等。它定义的是一对多的关系,即一个目标对象(Subject)管理一系列的观察者对象(Observer), 当目标对象发生变化时,所有依赖于它的观察者都会得到通知并自动更新。观察者模式在PHP项目中,用于使用松耦合以减少耦合对象。

具体应用场景如GUI中消息队列系统作为目标对象可以显示工作过程。PHP的SPL已经定义了SplObserver 和 SplSubject两个接口来帮助实现观察者模式。

class UserObserver implements SplObserver Continue reading PHP设计模式-观察者模式 Observer

PHP设计模式-空对象模式 NullObject

PHP空对象设计模式(NullObject)指的是提供一个对象给指定的类型,用以代替这个值为空null的情况。在GoF的书中没有提到这个结构。但NullObject确实也经常会碰到。

空对象设计模式具有以下特点:客户端代码简单,减少null 指针异常错误,减少if/else等判断,每次返回对象或者null时,改成返回对象或NullObject,就不用if(is_null($obj))这种语句了。 Continue reading PHP设计模式-空对象模式 NullObject

PHP设计模式-备忘录模式 Memento

PHP备忘录设计模式 (Memento)是指发起人(原始对象)通过将对象的内部状态,保存到外部对象(备忘录)中。这样需要时第三者(负责人)就很容易将对象恢复到原先被保存的状态。

备忘录模式有3个角色对象实现:

  • 发起人 Originator,原对象,含有内部状态,属性私有;可以将新状态保存到Memento,也可以恢复到旧状态;
  • 负责人 Caretaker,负责人通过Originator对象,可以发起保存或发起恢复;
  • 备忘录 Memento,自身是不透明的,Caretaker不能操作和更改它。保存Originator对象的内部状态;保护发起人内容不被Originator对象之外的任何对象所读取。Memento 只操作一个对象。

Continue reading PHP设计模式-备忘录模式 Memento

PHP设计模式-中介者模式 Mediator

PHP中介者设计模式(Mediator)使用一个中介者对象,统一对多个对象进行封装。可以更好地将多个组件组织在一起进行工作,有时这是比观察者模式更好的一种模式。中介者设计模式的关键在于,所有的组件(又称为合作者)都只和中介者进行交互。

// 中介者,接口不是必须的,为了遵循里氏替换原则(LSP)最好写上接口
interface MediatorInterface Continue reading PHP设计模式-中介者模式 Mediator

PHP设计模式-迭代器模式 Iterator

PHP迭代器设计模式(Iterator)提供了一种访问一个容器(container)对象中各个元素的方法,而又不需暴露该对象的内部细节。让对象类似一组对象集合并可以迭代。比如一行一行地处理文件,文件本身是一个对象,每行也是具有对象表现形式。

PHP 的SPL(Standard PHP Library)定义了一个Iterator 迭代器接口最适合这种设计模式。通常我们也希望实现可以对迭代对象进行计数,可以使用Countable接口。分别实现接口方法即可实现迭代器设计模式。 Continue reading PHP设计模式-迭代器模式 Iterator

PHP设计模式-命令模式 Command

PHP命令设计模式(Command)把一个请求或者操作封装到一个对象中,允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。PHP命令模式又称为行为模式或交易模式,请求的一方发出请求要求执行一个操作,接收的一方收到请求,并执行操作。该模式中请求方使用“命令”来委派请求任务,它只知道调用excute()去执行客户端命令,意味着允许请求方和接收方独立演化,互相实现解耦。

另一方面,命令设计模式可以实现撤销以及恢复功能,即撤销excute()方法。就像一个文本编辑器一样可以撤销和保存;Symfony2 中可以在终端运行的命令也是一种命令模式的思路。

有四种角色: 命令, 请求方, 接收方, 客户端

interface CommandInterface Continue reading PHP设计模式-命令模式 Command

PHP设计模式-责任链模式Chain Of Responsibilities

PHP责任链设计模式(Chain Of Responsibilities)将多个都可以处理任务请求的对象按顺序连成一条链,链上的每个对象都有责任/职责处理该请求;如果某个对象拒绝处理请求,它可以将请求传递给下一个对象,直到有对象处理了为止。发出这个请求的客户端并不知道链上的哪个对象最终处理这个请求,使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。

责任链设计模式应用场景

日志模型: 每一个链上元素自主决定如何处理一条日志信息。Spam过滤器也是如此。
Yii框架中的CFilterChain: 它是一条控制器的action过滤器。过滤动作沿着链从一个过滤器到下一个,只有所有的过滤规则都通过了,才会最终执行这个action。
多级缓存的例子: 比如查询请求会先通过 Memcached 缓存接口, 没有命中的话就会委托给数据库Query Cache,最后是数据库查询语句接口。 Continue reading PHP设计模式-责任链模式Chain Of Responsibilities

PHP设计模式-注册模式 Registry

PHP注册设计模式(Registry)通过注册器,统一保存了应用中经常用到的那些对象;注册器通常使用一个只有静态方法的抽象方法来实现,或者通过单例模式实现。

PHP框架中的注册器设计模式示例

Zend 框架: Zend_Registry 类保存了整个应用的日志对象,前台控制器等。
Yii 框架: 类保存了CWebUser, CUrlManager等所有的应用组件。

下面是设计一个简单的注册设计模式的PHP代码:

abstract class Registry Continue reading PHP设计模式-注册模式 Registry

PHP设计模式-代理模式 Proxy

PHP代理设计模式(Proxy)给某个无法复制或需要花费较大成本复制的对象提供一个代理对象,或者数据要先经过代理对象进行预处理或后处理的,由代理对象控制对原对象的引用。

interface Subject
{
      public function request();
}
class RealSubject implements Subject Continue reading PHP设计模式-代理模式 Proxy

PHP设计模式-连贯接口 FluentInterface

PHP连贯设计模式(FluentInterface)可以让我们像读自然语言中的句子一样容易。比如kohana等PHP框架中Query Builder,PHPUnit创建mock对象,Yii中CDbCommand 和 CActiveRecord 等都使用了FluentInterface。比如以下的数据库类的连贯接口。

class Sql Continue reading PHP设计模式-连贯接口 FluentInterface