三、模板方法模式
3.1什么是模板方法模式
定义一个操作中的算法的框架,而将一些步骤延时到子类中。使得子类可以不改变一个算法结构即可重定义该算法的某些特定步骤。
简单来说,就是定义一个有步骤的父类,然后其中的一些步骤方法允许子类重写,而核心的步骤方法不能被重写。比如定义一个买菜
流程。buy(买菜)方法中依次调用了 goOut(出门)、choose(选菜)、pay(付钱)、goBack(回家) 方法。我允许你将除了 buy() 方法
外的其他方法给重写。这种形式就叫做模式方法模式。
3.2怎么实现模式
基础方法:
<?php
// 基础模板类
abstract class BaseClass
{
abstract protected function goOut();
abstract protected function choose();
abstract protected function pay();
abstract protected function goBack();
final public function buy()
{
$this->goOut();
$this->choose();
$this->pay();
$this->goBack();
}
}
// 具体实现类
class ChildClass extends BaseClass
{
protected function goOut(){echo 'go out:骑车' . PHP_EOL;}
protected function choose(){echo 'choose:番茄' . PHP_EOL;}
protected function pay(){echo 'pay:现金' . PHP_EOL;}
protected function goBack(){echo 'go back:坐车' . PHP_EOL;}
}
$mode1 = new ChildClass();
$mode1->buy();
3.3模式方法模式优点是什么
-
封装不变部分,扩展可变部分
把认为是不变部分的算法封装到父类实现,而可变部分的则可以通过继承来继续扩展。
就比如上面买菜的例子。我在来另一个人去买菜,新增一个子类就行了 -
提取公共部分代码,便于维护
-
行为由父类控制,子类实现
3.4模式方法模式缺点是什么
按照我们的设计习惯,抽象类负责声明最抽象、最一般的事物属性和方法,实现类完成具体的事物属性和方法。
但是模板方法模式却颠倒了,抽象类定义了部分抽象方法,由子类实现,子类执行的结果影响了父类的结果,也就是子类对父类产生了影响