PHP設(shè)計(jì)模式之模板方法模式實(shí)例淺析
本文實(shí)例講述了PHP設(shè)計(jì)模式之模板方法模式。分享給大家供大家參考,具體如下:
定義一個(gè)操作中的算法的框架,而將一些步驟延遲到子類中。使得子類可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。
模板方法模式中會(huì)用到抽象模板,它的方法分為兩類:
- 基本方法,也叫做基本操作,是由子類實(shí)現(xiàn)的方法,并且在模板方法被調(diào)用。
- 模板方法,可以有一個(gè)或多個(gè),一般是一個(gè)具體方法,也就是一個(gè)框架,實(shí)現(xiàn)基本方法的調(diào)度,完成固定邏輯。
注意: 為了防止惡意的操作,一般模板方法都加上final關(guān)鍵字,不允許被覆寫。
注意: 抽象模板中的基本方法盡量設(shè)計(jì)為protected類型,符合迪米特法則,不需要暴露的屬性或方法盡量不要設(shè)置為protected類型。實(shí)現(xiàn)類若非必要,盡量不要擴(kuò)大父類中的訪問(wèn)權(quán)限。
模板方法模式的優(yōu)點(diǎn)
- 封裝不變部分,擴(kuò)展可變部分。
- 提取公共部分代碼,便于維護(hù)。
- 行為由父類控制,子類實(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
注:部分內(nèi)容摘自《設(shè)計(jì)模式之禪》
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語(yǔ)法入門教程》、《PHP運(yùn)算與運(yùn)算符用法總結(jié)》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫(kù)操作入門教程》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總》
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
相關(guān)文章
php通過(guò)asort()給關(guān)聯(lián)數(shù)組按照值排序的方法
這篇文章主要介紹了php通過(guò)asort()給關(guān)聯(lián)數(shù)組按照值排序的方法,實(shí)例分析了php中asort()函數(shù)的功能與使用技巧,需要的朋友可以參考下2015-03-03PHP后期靜態(tài)綁定之self::限制實(shí)例分析
這篇文章主要介紹了PHP后期靜態(tài)綁定之self::限制,結(jié)合實(shí)例形式分析了php后期靜態(tài)綁定self::與static相關(guān)使用技巧,需要的朋友可以參考下2018-12-12PHP中__FILE__、dirname與basename用法實(shí)例分析
這篇文章主要介紹了PHP中__FILE__、dirname與basename用法,以實(shí)例形式較為詳細(xì)的分析了__FILE__、dirname與basename的具體用法,并測(cè)試對(duì)比了WordPress中自帶的函數(shù),需要的朋友可以參考下2014-12-12深入解析yii權(quán)限分級(jí)式訪問(wèn)控制的實(shí)現(xiàn)(非RBAC法)
本篇文章是對(duì)yii權(quán)限分級(jí)式訪問(wèn)控制的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06PHP laravel實(shí)現(xiàn)導(dǎo)出PDF功能
有時(shí)候我們會(huì)需要使用PHP導(dǎo)出pdf。這篇文章主要是記錄一下laravel實(shí)現(xiàn)導(dǎo)出PDF的兩種方式。文中的示例代碼講解詳細(xì),需要的可以參考一下2022-10-10支持?jǐn)?shù)組的ADDSLASHES的php函數(shù)
支持?jǐn)?shù)組的ADDSLASHES2010-02-02PHP與Java對(duì)比學(xué)習(xí)日期時(shí)間函數(shù)
本文給大家介紹的是從Java和PHP進(jìn)行對(duì)比復(fù)習(xí)了下日期時(shí)間的處理函數(shù),并給出了一些示例,希望對(duì)大家能夠有所幫助2016-07-07