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.

没有评论: