PHP設計模式之模板方法模式 Template Method
- 首先我們不說什麼是模板方法模式,可以先看一個生活種的小例子,然後由生活中的小例子再來談談這個模板方法模式的實現。
生活中大家早上上班,如果不是自己做飯的,一般都是在外面買這吃的,一般買包子搭配豆漿,這個是最快捷而且省錢的一種搭配方式,那麼包子老闆做包子
一般分為幾個步驟呢,一般都是先挑選緊緻的麵粉,然後會讓麵粉發酵,準備包包子的原材料,比如肉包子,韭菜包子,粉絲包子,海帶包子,只要你能想的到,
老闆都會滿足你,包好包子之後,會把包子放在蒸籠裡蒸熟,最後經過20-30分鐘之後,包子就出籠了,顧客就買到了香噴噴的包子了。那麼對於蒸包子來說,其
實這個步驟都是固定的,第一步:麵粉發酵做成麵糰;第二步就是準備包包子的材料,這個材料是不固定的,有各種口味材料的包子;第三步也是固定的,燒水利
用水蒸氣蒸包子,第四步:包子出籠
- 透過上面的蒸包子的案例,就可以使用程式來展示出來,我們首先需要一個抽象類,這個類就是
BunAbstract
它有一個對外提供的方法,make()
方法,
主要的作用就是把後面的四個步驟整合到這個方法中,對外呼叫,剩下的蒸包子方法,可以分解為四個方法: 1.麵粉發酵 2.選擇新增材料 3.包包子 4.蒸包子
5.出鍋完成
//麵粉發酵
function flourFermentation(){}
//選擇新增材料
function addMaterial(){}
//包包子
function steamedBuns(){}
//蒸包子
function steamBuns(){}
//出鍋
function outOfThePot(){}
- 完整的抽象包子類如下,對外提供的製作方法是不允許修改的,所以使用關鍵字
final
。包子的製作包餡的材料是不固定的,所以它是一個抽象方法,留
給繼承者實現:
abstract class BunAbstract
{
final public function make()
{ $this->flourFermentation();
$this->addMaterial();
$this->steamedBuns();
$this->steamBuns();
$this->outOfThePot();
}
//麵粉發酵
function flourFermentation()
{ echo "開始計量麵粉,製作麵糰,發酵" . PHP_EOL;
}
//選擇新增材料
abstract public function addMaterial();
//包包子
private function steamedBuns()
{ echo "材料準備完畢,開始包包子了" . PHP_EOL;
}
//蒸包子
private function steamBuns()
{ echo "水燒開了,把包好的包子放入蒸籠中,蒸包子" . PHP_EOL;
}
//出鍋
private function outOfThePot()
{ echo "新鮮出籠的包子蒸好了,準備出籠了" . PHP_EOL;
}}
- 現在如果需要瘦肉餡的包子,就繼承一個抽象包子類,來實現
addMaterial()
這個方法
class LeanMeat extends BunAbstract{
public function addMaterial()
{ // TODO: Implement addMaterial() method.
echo "準備瘦肉類材料" . PHP_EOL;
}}
- 再製作一個海帶類的包子,就繼承一個抽象包子類,來實現
addMaterial()
這個方法
class Kelp extends BunAbstract{
public function addMaterial()
{ // TODO: Implement addMaterial() method.
echo "準備海帶類的材料" . PHP_EOL;
}}
最後的測試類:Client
class Client
{
public function __construct()
{ $test1 = new Kelp();
$test1->make();
$test2 = new LeanMeat();
$test2->make();
}}
require "./../vendor/autoload.php";
new Client();
在模板模式(Template Pattern)中,一個抽象類公開定義了執行它的方法的方式/模板。它的子類可以按需要重寫方法實現,但呼叫將以抽象類中定義的
方式進行。這種型別的設計模式屬於行為型模式。定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。
優點: 1、封裝不變部分,擴充套件可變部分。 2、提取公共程式碼,便於維護。 3、行為由父類控制,子類實現。
本作品採用《CC 協議》,轉載必須註明作者和本文連結
LIYi ---- github地址