PHP设计模式中的模板模式 (Template Pattern) 是一种行为设计模式,它定义了一套算法流程,将某个流程中的某些步骤延迟到子类中实现,保留待子类实现的步骤,以此来实现代码重用和解耦的效果。
模板模式包含两类方法:具体方法和抽象方法。具体方法是这个模板流程中的固定步骤,而抽象方法则是需要子类实现的步骤。
在PHP中实现模板模式,一般需要定义一个抽象的模板类,其中包含具体方法和抽象方法。具体方法就是模板流程中的固定步骤,这些步骤在这个模板类中都提供了默认的实现;而抽象方法则是需要子类实现的步骤,这些步骤在模板类中并没有具体的实现。
下面是模板模式的PHP示例代码。
<?php
abstract class AbstractClass {
protected $data;
public function doSomething($data) {
$this->data = $data;
$this->stepOne();
$this->stepTwo();
}
protected function stepOne() {
echo "AbstractClass:stepOne\n";
}
protected function stepTwo() {
echo "AbstractClass:stepTwo\n";
}
protected abstract function stepThree();
}
class ConcreteClass extends AbstractClass {
protected function stepThree() {
echo "ConcreteClass:stepThree(" . $this->data . ")\n";
}
}
$concrete = new ConcreteClass();
$concrete->doSomething("data");
?>
在这个示例中,AbstractClass
是一个抽象类,它定义了一个 doSomething()
方法,这个方法包含了一个模板流程。stepOne()
和 stepTwo()
是具体方法,它们在 AbstractClass
中都提供了默认的实现。而 stepThree()
是抽象方法,子类 ConcreteClass
必须实现这个方法。
ConcreteClass
继承了 AbstractClass
并实现了 stepThree()
方法,这个方法在 doSomething()
中会被调用。在 doSomething()
中,先是执行了 stepOne()
,然后又执行了 stepTwo()
,最后再执行了 stepThree()
。
下面再看一个模板模式的示例,这里使用了模板方法模式和策略模式的结合。
<?php
abstract class AbstractLogger {
public function log($message, $strategy) {
$this->beforeLog($strategy);
echo $message . "\n";
$this->afterLog($strategy);
}
protected abstract function beforeLog($strategy);
protected abstract function afterLog($strategy);
}
class Logger extends AbstractLogger {
protected function beforeLog($strategy) {
if ($strategy == "file") {
echo "Opening file...\n";
}
}
protected function afterLog($strategy) {
if ($strategy == "file") {
echo "Closing file...\n";
}
}
}
$logger = new Logger();
$logger->log("log message", "database");
$logger->log("log message", "file");
?>
在这个示例中,AbstractLogger
是一个抽象类,它定义了一个 log()
方法,这个方法包含了一个模板流程。beforeLog()
和 afterLog()
是抽象方法,子类必须实现这些方法。
Logger
继承了 AbstractLogger
并实现了 beforeLog()
和 afterLog()
方法,这些方法在 log()
中会被调用。
在 log()
中,先是执行了 beforeLog()
,然后输出了日志信息,最后再执行了 afterLog()
。根据传入的策略参数,可以选择不同的日志记录方式,比如在 beforeLog()
方法中打开文件,在 afterLog()
中关闭文件。这种结构就将模板方法模式和策略模式的优点结合起来,代码更加灵活。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:php设计模式 Template (模板模式) - Python技术站