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.
没有评论:
发表评论