我所理解的模板方法模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我所理解的模板方法模式相关的知识,希望对你有一定的参考价值。

定义


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

参与角色

抽象类(AbstractClass)

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

具体类(子类)

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

优点

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

使用场景

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

代码示例

# 抽象类  AbstractClass.php
<?php

namespace AppTest;


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 AppTest;


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 AppTest;


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';
    }


}

原文地址:https://segmentfault.com/a/1190000016164272

以上是关于我所理解的模板方法模式的主要内容,如果未能解决你的问题,请参考以下文章

我所理解极简java的23种经典设计模式(附加举例)

JAVA模板方法设计模式(从现实生活角度理解代码原理)

深入理解JavaScript系列(41):设计模式之模板方法

Android:带有片段的模板模式

设计模式之模板方法模式实战解析

学习笔录——大话设计模式——模板方法模式