显示标签为“设计模式”的博文。显示所有博文
显示标签为“设计模式”的博文。显示所有博文

2007年7月9日星期一

Observer pattern

观察者模式 Observer Pattern


观察者模式为您提供了避免组件之间紧密耦合的另一种方法。该模式非常简单:一个对象通过添加一个方法(该方法允许另一个对象,即观察者 注册自己)使本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者。这些观察者使用该信息执行的操作与可观察的对象无关。结果是对象可以相互对话,而不必了解原因。



SPL 提供的 Observer 接口:
观察者:
SplObserver::update(SplSubject $subject)
观察者接口,由被观察对象调用。

主题(被观察者):
SplSubject::attach(SplObserver $observer)
参数:
$observer 要添加的观察者

SplSubject::detach(SplObserver $observer)
参数:
$observer 要删除的观察者

SplSubject::notify()
通知所有观察者.

2007年6月13日星期三

The Template Method Pattern in PHP 5

php5模板方法模式


节选翻译,原文: http://www.zend.com/zend/php5/php5-OOP.php

什么是模板方法模式?定义一个操作中算法的骨架,将一些步骤的执行放到其子类中.
这是一种重要的代码重用技术。模板方法模式通常用在类库中提取类的共同的行为。
模板方法设计模式可以让子类去重新定义一个操作中的某些步骤,而不用去改变这个操作的结构。
这些可重新定义的步骤可以在基类中标为强制的或者可选的。由于这些步骤都会归于单独的方法,所以子类必须为强制的步骤提供一个实现方法,可选的则可以忽略。

模板方法可以实现一个操作中不变的部分,把那些可能变化的行为留给子类实现。也可以用于仅在在指定点提供hook操作来给子类扩展行为。

例子


Listing 1. AbstractClass.php



Listing 1 显示了一个迷你的模板方法,叫做 templateMethod()。它使用了两个方法:mandatoryOperation() 和 optionalOperation(), 这两个可以在子类中重定义。
abstract class AbstractClass {
public final function templateMethod() {
print "AbstractClass::templateMethod() called.\n";

$this->mandatoryOperation();
$this->optionalOperation();
}

protected abstract function mandatoryOperation();

protected function optionalOperation() {
}
}



Listing 2: ConcreteClass.php



Listing 2 显示了一个和 AbstractClass 类对应的子类。 ConcreteClass 重定义了mandatoryOperation() 和 optionalOperation() 方法。

require_once 'AbstractClass.php';

class ConcreteClass extends AbstractClass {
protected function mandatoryOperation() {
print "ConcreteClass::mandatoryOperation() called.\n";
}

protected function optionalOperation() {
print "ConcreteClass::optionalOperation() called.\n";
}
}


Listing 3: example.php



最后, Listing 3 显示了如何调用 ConcreteClass 。

require_once 'ConcreteClass.php';

$o = new ConcreteClass;
$o->templateMethod();


输出:
AbstractClass::templateMethod() called.
ConcreteClass::mandatoryOperation() called.
ConcreteClass::optionalOperation() called.