• 我所理解的模板方法模式


    定义

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

    参与角色

    抽象类(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

  • 相关阅读:
    mysql查询两个日期之前相隔的天数
    数据库脏读、不可重读读、幻读
    kafka手动开启监听
    oracle更具uuid排序后进行分页
    idea右键没有svn选项
    alibaba dubbo admin的安装
    简单的可以跑起来的dubbo例子
    tomcat配置内存
    redis介绍和安装
    Python深入:Distutils发布Python模块
  • 原文地址:https://www.cnblogs.com/lalalagq/p/9973692.html
Copyright © 2020-2023  润新知