本文實(shí)例講述了PHP設(shè)計(jì)模式之模板方法模式。分享給大家供大家參考,具體如下:
定義一個(gè)操作中的算法的框架,而將一些步驟延遲到子類(lèi)中。使得子類(lèi)可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。
模板方法模式中會(huì)用到抽象模板,它的方法分為兩類(lèi):
- 基本方法,也叫做基本操作,是由子類(lèi)實(shí)現(xiàn)的方法,并且在模板方法被調(diào)用。
- 模板方法,可以有一個(gè)或多個(gè),一般是一個(gè)具體方法,也就是一個(gè)框架,實(shí)現(xiàn)基本方法的調(diào)度,完成固定邏輯。
注意: 為了防止惡意的操作,一般模板方法都加上final關(guān)鍵字,不允許被覆寫(xiě)。
注意: 抽象模板中的基本方法盡量設(shè)計(jì)為protected類(lèi)型,符合迪米特法則,不需要暴露的屬性或方法盡量不要設(shè)置為protected類(lèi)型。實(shí)現(xiàn)類(lèi)若非必要,盡量不要擴(kuò)大父類(lèi)中的訪問(wèn)權(quán)限。
模板方法模式的優(yōu)點(diǎn)
- 封裝不變部分,擴(kuò)展可變部分。
- 提取公共部分代碼,便于維護(hù)。
- 行為由父類(lèi)控制,子類(lèi)實(shí)現(xiàn)
示例:
<?php /** * 模型方法模式 */ abstract class ACar { abstract protected function start(); abstract protected function engineBoom(); abstract protected function alarm(); abstract protected function stop(); public function run() { $this->start(); $this->engineBoom(); $this->alarm(); $this->stop(); } } final class Benz extends ACar { protected function start() { echo 'Benz start' . PHP_EOL; } protected function engineBoom() { echo 'Benz engine boom' . PHP_EOL; } protected function alarm() { echo 'Benz alarm' . PHP_EOL; } protected function stop() { echo 'Benz stop' . PHP_EOL; } } final class BMW extends ACar { protected function start() { echo 'BMW start' . PHP_EOL; } protected function engineBoom() { echo 'BMW engine boom' . PHP_EOL; } protected function alarm() { echo 'BMW alarm' . PHP_EOL; } protected function stop() { echo 'BMW stop' . PHP_EOL; } // 修改順序 public function run() { $this->start(); $this->alarm(); $this->engineBoom(); $this->stop(); } } class Client { public static function run() { $benz = new Benz(); $benz->run(); $bmw = new BMW(); $bmw->run(); } } Client::run();
運(yùn)行結(jié)果:
Benz start Benz engine boom Benz alarm Benz stop BMW start BMW alarm BMW engine boom BMW stop
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。