这篇文章主要介绍了PHP设计模式之模板方法模式,结合实例形式简单分析了php设计模式中模板方法模式的概念、原理、定义、使用方法及相关操作注意事项,需要的朋友可以参考下
本文实例讲述了PHP设计模式之模板方法模式。分享给大家供大家参考,具体如下:
定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
模板方法模式中会用到抽象模板,它的方法分为两类:
- 基本方法,也叫做基本操作,是由子类实现的方法,并且在模板方法被调用。
- 模板方法,可以有一个或多个,一般是一个具体方法,也就是一个框架,实现基本方法的调度,完成固定逻辑。
注意: 为了防止恶意的操作,一般模板方法都加上final关键字,不允许被覆写。
注意: 抽象模板中的基本方法尽量设计为protected类型,符合迪米特法则,不需要暴露的属性或方法尽量不要设置为protected类型。实现类若非必要,尽量不要扩大父类中的访问权限。
模板方法模式的优点
- 封装不变部分,扩展可变部分。
- 提取公共部分代码,便于维护。
- 行为由父类控制,子类实现
示例:
<?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();
运行结果:
Benz start Benz engine boom Benz alarm Benz stop BMW start BMW alarm BMW engine boom BMW stop
注:部分内容摘自《设计模式之禅》
更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。
本文标题为:PHP设计模式之模板方法模式实例浅析
基础教程推荐
- PHP获取MySQL执行sql语句的查询时间方法 2022-11-09
- laravel ORM关联关系中的 with和whereHas用法 2023-03-02
- 在Laravel中实现使用AJAX动态刷新部分页面 2023-03-02
- laravel 解决多库下的DB::transaction()事务失效问题 2023-03-08
- PHP实现Redis单据锁以及防止并发重复写入 2022-10-12
- 使用PHP开发留言板功能 2023-03-13
- PHP命名空间简单用法示例 2022-12-01
- thinkphp3.2.3框架动态切换多数据库的方法分析 2023-03-19
- php array分组,PHP中array数组的分组排序 2022-08-01
- PHP中的错误及其处理机制 2023-06-04