设计模式-Template(模版模式)
模版方法模式-封装方法
定义:模版方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,模版方法使得子类可以在不改变算法结构情况下,重新定义算法中的某些步骤。
个人理解:模版方法,其实是在超类中制订好了对应的算法规则,而具体的算法实现可以放到子类里面来实现。
<?php /** * 定义:模版方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,模版方法使得子类可以在不改变算法结构情况下,重新定义算法中的某些步骤。 * 我们就参考书中的例子星巴克的泡茶和咖啡的过程 * 泡茶 把水煮沸,用沸水侵泡茶叶,把茶叶倒进杯子,加柠檬 * 泡咖啡 把水煮沸,用沸水冲泡咖啡,把咖啡倒进杯子,加糖和牛奶 * 抽象算法 把水煮沸,冲泡,把饮料倒进杯子,加调料 * 当然有些可能不需要加调料 那么引入一个钩子的函数 方便子类进行一定的调整 */ abstract class CaffeineBeverage { public final function prepareRecipe(){ $this->boilWater();//把水煮沸 $this->brew();//冲泡 $this->pourInCup();//把饮料倒进杯子 if($this->isAddCondiments()){ $this->addCondiments(); //加调料 } } abstract function brew(); abstract function addCondiments(); function boilWater() { echo __FUNCTION__."\r\n"; } function pourInCup(){ echo __FUNCTION__."\r\n"; } function isAddCondiments(){ return true; } } class Tea extends CaffeineBeverage{ public function brew(){ echo __CLASS__.__FUNCTION__."\r\n"; } public function addCondiments(){ echo __CLASS__.__FUNCTION__."\r\n"; } function isAddCondiments(){ //这个函数可以复写或者不用都可以 看具体需求例如我不需要一个加调料的茶 那么就复写 返回false return true; } } $tea = new Tea(); $tea->prepareRecipe();