003-PHP设计模式之模板方法模式

模板方法模式是一种设计模式,它定义了一个操作的主要步骤,并允许子类在不改变算法结构的情况下重定义某些特定步骤。在示例中,基础模板类`BaseClass`定义了买菜流程,包括出门、选菜、付钱和回家四个步骤,其中每个步骤都是抽象方法,由子类`ChildClass`具体实现。这种模式的优点在于它可以封装不变部分,方便扩展和维护,但缺点是子类可能影响父类的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

三、模板方法模式

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模式方法模式优点是什么

  1. 封装不变部分,扩展可变部分

    把认为是不变部分的算法封装到父类实现,而可变部分的则可以通过继承来继续扩展。
    就比如上面买菜的例子。我在来另一个人去买菜,新增一个子类就行了

  2. 提取公共部分代码,便于维护

  3. 行为由父类控制,子类实现

3.4模式方法模式缺点是什么

按照我们的设计习惯,抽象类负责声明最抽象、最一般的事物属性和方法,实现类完成具体的事物属性和方法。
但是模板方法模式却颠倒了,抽象类定义了部分抽象方法,由子类实现,子类执行的结果影响了父类的结果,也就是子类对父类产生了影响

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值