模板方法模式(Template Method Pattern)定义一个算法的步骤,并允许子类提供一些步骤的具体实现。这使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤。
模板方法模式的主要角色:
– 抽象类(Abstract Class):定义了算法的框架和主要步骤,并在一些步骤中实现默认行为。
– 具体子类(Concrete Class):实现抽象类中所定义的抽象方法,提供某些步骤的具体实现。
模板方法模式的优点:
– 封装不变部分,扩展可变部分:模板方法模式实现了稳定的算法框架,而可变的步骤由子类实现。
– 避免重复:每个子类只需要实现自己需要变化的部分,不变部分由父类提供。
– 流程控制:算法的控制流程由父类 all,子类只需要关注自身的实现逻辑。下面通过一个实例来演示模板方法模式的用法。
抽象类:
abstract class Beverage { final function prepareRecipe() { $this->boilWater(); $this->brew(); $this->pourInCup(); $this->addCondiments(); } abstract function brew(); abstract function addCondiments(); function boilWater() { echo "Boiling water\n"; } function pourInCup() { echo "Pouring into cup\n"; } }
具体子类:
class Coffee extends Beverage { function brew() { echo "Dripping coffee through filter\n"; } function addCondiments() { echo "Adding sugar and milk\n"; } } class Tea extends Beverage { function brew() { echo "Steeping the tea\n"; } function addCondiments() { echo "Adding lemon\n"; } }
测试:
$coffee = new Coffee(); $coffee->prepareRecipe(); $tea = new Tea(); $tea->prepareRecipe();
输出:
Boiling water Dripping coffee through filter Pouring into cup Adding sugar and milk Boiling water Steeping the tea Pouring into cup Adding lemon
通过这个实例,我们清晰的看到模板方法模式的结构和工作机制。
Beverage类定义了算法框架,而子类Coffee和Tea具体实现了需要变化的步骤,从而完成两个不同类型饮料的准备过程。
© 版权声明
本文刊载的所有内容,包括文字、图片、音频、视频、软件、程序、以及网页版式设计等部门来源于互联网,版权均归原作者所有!本网站提供的内容服务于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯本网站及相关权利人的合法权利。
联系信息:邮箱aoxolcom@163.com或见网站底部。
联系信息:邮箱aoxolcom@163.com或见网站底部。
THE END
请登录后发表评论
注册
社交帐号登录