模板方法模式也是一种常用的设计模式,它属于行为性设计模式。它的定义是:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
场景
一般周末早上起来比较晚,就不会出去买早点吃,可能就会泡一桶方便面或酸辣粉或淮南牛肉汤。泡方便面或酸辣粉的步骤是一样的,首先需要准备开水,然后用开水泡方便面或酸辣粉,接下来加入自己的调料包,最后泡上2~3分钟就行了。这中间有两个步骤完全一致(准备开水、泡2~3分钟)、有两个步骤类似(泡食材、加入各自调料包)。
对于上面的场景,我们可以定义一个泡方便面或酸辣粉的算法。这个算法非常简单,4个步骤
准备开水
泡食材(方便面或酸辣粉)
加调料(方便面、酸辣粉有自己的调料包)
在开水中浸泡2~3分钟
现在,我们用模板方法模式来完成上述需求。
首先,定义一个抽象类,抽象类里定义具体的算法,以及各个步骤。
abstract class Breakfast { final public function prepare () { $this->boilWater(); $this->brew(); $this->addSeasoning(); $this->wait(); } public function boilWater () { echo '准备开水' . PHP_EOL; } // 泡食材 abstract public function brew (); // 加调料 abstract public function addSeasoning (); public function wait () { echo '等待2~3分钟' . PHP_EOL; } }
prepare方法里就是具体的算法,给这个方法加上final是防止该方法被重写。另外,你可以看到这里面有两个抽象方法,需要后代去自行完成。
接下来,我们来完成方便面及酸辣粉的类。这两个类需继承Breakfast,然后完成抽象方法。
class Noodle extends Breakfast { public function brew () { echo '加入方便面' . PHP_EOL; } public function addSeasoning () { echo '加入方便面的调料包' . PHP_EOL; } } class Powder extends Breakfast { public function brew () { echo '加入酸辣粉' . PHP_EOL; } public function addSeasoning () { echo '加入酸辣粉的调料包' . PHP_EOL; } }
上述的例子就是一个典型的模板方法模式,父类里定义算法骨架,子类完成算法中的一些步骤。
钩子
上述的例子,体现了模板方法模式中一个常用场景:复用。除了复用外,模板方法模式还是一个重要的应用——扩展。
模板方法模式是通过钩子来实现扩展的。钩子是一种声明在抽象类中的方法,但只有空的或默认的实现。钩子的存在,让子类有能力对算法不同点进行挂钩。要不要挂钩,由子类自己决定。
下面我们继续通过例子来讲解钩子的使用,一般我吃泡面的时候,会加火腿或鸡蛋。加火腿和鸡蛋这个是不确定的,所以我们可以钩子,让子类自己决定要不要加火腿或鸡蛋。
修改Breakfast.php
abstract class Breakfast { final public function prepare () { $this->boilWater(); $this->brew(); $this->addSeasoning(); $this->hook(); $this->wait(); } // 省略部分方法 // 默认不做任何事情 public function hook () :void {} }
修改Noodle.php,重写hook方法
public function hook(): void { echo '加入火腿和鸡蛋' . PHP_EOL; }
模板方法模式与回调函数
php中有许多的函数用了类似模板方法模式或策略模式的思想,比如sort()函数,它封装了排序的算法,但是具体的排序规则,由回调函数去完成。通过回调函数就不用去创建抽象类以及子类了,大大的减少了代码量。
模板方法模式与工厂方法模式、策略模式的关系
工厂方法模式时模板方法模式一个特殊的形式。
模板方法基于继承机制: 它允许你通过扩展子类中的部分内容来改变部分算法。
策略模式基于组合机制: 你可以通过对相应行为提供不同的策略来改变对象的部分行为。
模板方法在类层次上运作, 因此它是静态的。 策略在对象层次上运作, 因此允许在运行时切换行为。
以上是一文读懂php设计模式之模板方法模式的详细内容。更多信息请关注PHP中文网其他相关文章!

aphpdepentioncontiveContainerIsatoolThatManagesClassDeptions,增强codemodocultion,可验证性和Maintainability.itactsasaceCentralHubForeatingingIndections,因此reducingTightCightTightCoupOulplingIndeSingantInting。

选择DependencyInjection(DI)用于大型应用,ServiceLocator适合小型项目或原型。1)DI通过构造函数注入依赖,提高代码的测试性和模块化。2)ServiceLocator通过中心注册获取服务,方便但可能导致代码耦合度增加。

phpapplicationscanbeoptimizedForsPeedAndeffificeby:1)启用cacheInphp.ini,2)使用preparedStatatementSwithPdoforDatabasequesies,3)3)替换loopswitharray_filtaray_filteraray_maparray_mapfordataprocrocessing,4)conformentnginxasaseproxy,5)

phpemailvalidation invoLvesthreesteps:1)格式化进行regulareXpressecthemailFormat; 2)dnsvalidationtoshethedomainhasavalidmxrecord; 3)

tomakephpapplicationsfaster,关注台词:1)useopcodeCachingLikeLikeLikeLikeLikePachetoStorePreciledScompiledScriptbyTecode.2)MinimimiedAtabaseSqueriSegrieSqueriSegeriSybysequeryCachingandeffeftExting.3)Leveragephp7 leveragephp7 leveragephp7 leveragephpphp7功能forbettercodeefficy.4)

到ImprovephPapplicationspeed,关注台词:1)启用opcodeCachingwithapCutoredUcescriptexecutiontime.2)实现databasequerycachingusingpdotominiminimizedatabasehits.3)usehttp/2tomultiplexrequlexrequestsandredececonnection.4 limitsclection.4.4

依赖注入(DI)通过显式传递依赖关系,显着提升了PHP代码的可测试性。 1)DI解耦类与具体实现,使测试和维护更灵活。 2)三种类型中,构造函数注入明确表达依赖,保持状态一致。 3)使用DI容器管理复杂依赖,提升代码质量和开发效率。

databasequeryOptimizationinphpinvolVolVOLVESEVERSEVERSTRATEMIESOENHANCEPERANCE.1)SELECTONLYNLYNESSERSAYCOLUMNSTORMONTOUMTOUNSOUDSATATATATATATATATATATRANSFER.3)


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

Dreamweaver Mac版
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。