我所理解的模板方法模式

170 阅读1分钟
原文链接: segmentfault.com

定义

在父类中定义处理流程的框架,在子类中实现具体处理的模式就称为模板方法模式

参与角色

抽象类(AbstractClass)

抽象类不仅负责实现模板方法,还负责声明在模板方法中所使用到的抽象方法。

具体类(子类)

该角色负责具体实现抽象类角色中定义的抽象方法。这里实现的方法将会在抽象类角色的模板方法中被调用。

优点

  • 封装不变部分,扩展可变部分
  • 提取公共部分代码,便于维护
  • 行为由父类控制,子类负责实现

使用场景

  • 多个子类有共有方法,并且逻辑基本相同
  • 重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现
  • 重构时,模板方法是一个经常使用的方法,把相同的代码抽取到父类中,然后通过构造函数约束其行为

代码示例

# 抽象类  AbstractClass.php
<?php

namespace App\Test;


abstract class AbstractClass
{
    /**
     * 模板方法,定义执行的流程
     */
    final public function main()
    {
        $this->operate1();
        $this->operate2();
    }

    /**
     * 操作1
     * @return mixed
     */
    abstract protected function operate1();

    /**
     * 操作2
     * @return mixed
     */
    abstract protected function operate2();

}
# 具体类1 ConcreteClassOne.php

<?php

namespace App\Test;


class ConcreteClassOne extends AbstractClass
{
    
    /**
     * 操作1
     * @return mixed|void
     */
    protected function operate1()
    {
        echo 'ConcreteClassOne: this is operate1';
    }

    /**
     * 操作2
     * @return mixed|void
     */
    protected function operate2()
    {
        echo "ConcreteClassOne: this is operate2";
    }


}
# 具体类2  ConcreteClassTwo
<?php

namespace App\Test;


class ConcreteClassTwo extends AbstractClass
{

    /**
     * 操作1
     * @return mixed|void
     */
    protected function operate1()
    {
        echo 'ConcreteClassTwo: this is operate1';
    }

    /**
     * 操作2
     * @return mixed|void
     */
    protected function operate2()
    {
        echo 'ConcreteClassTwo: this is operate2';
    }


}