php设计模式(十八)模板方法模式

组合型的设计模式本质是使用组合替代继承;
但是继承并非一无是处;
只是因为大家容易滥用继承造成强耦合;
作为面向对象编程的三大特性之一;
继承还是很有价值的;
比如说本篇文章要讲的模板方法模式;
就是依赖于继承来实现;

结构

抽象类: 定义操作中骨架;比如说执行顺序等;讲具体的执行内容延迟到子类;
子类: 定义具体的执行内容;

示例

Phone.php

<?php

namespace Baijunyao\DesignPatterns\Template;

/**
 * Class Phone
 *
 * @package Baijunyao\DesignPatterns\Template
 */
abstract class Phone
{
    /**
     * 定义操作顺序
     */
    final public function action()
    {
        $this->powerOn();
        $this->showLogo();
        $this->callUp();
    }

    /**
     * 开机
     */
    protected function powerOn()
    {
        echo '开机' . '<br>';
    }

    /**
     * logo
     *
     * @return mixed
     */
    abstract protected function showLogo();

    /**
     * 打电话
     */
    protected function callUp()
    {
        echo '打电话' . '<br>';
    }
}

Xiaomi.php

<?php

namespace Baijunyao\DesignPatterns\Template;

/**
 * Class Xiaomi
 *
 * @package Baijunyao\DesignPatterns\Template
 */
class Xiaomi extends Phone
{
    /**
     * logo
     *
     * @return mixed|void
     */
    protected function showLogo()
    {
        echo '小米logo'. '<br>';
    }
}

Huawei.php

<?php

namespace Baijunyao\DesignPatterns\Template;

/**
 * Class Huawei
 *
 * @package Baijunyao\DesignPatterns\Template
 */
class Huawei extends Phone
{
    /**
     * 打电话
     *
     * @return mixed|void
     */
    protected function showLogo()
    {
        echo '华为logo'. '<br>';
    }
}

运行;
index.php

<?php

namespace Baijunyao\DesignPatterns\Template;

require __DIR__.'/../vendor/autoload.php';

/**
 * 客户端
 *
 * Class Client
 * @package Baijunyao\DesignPatterns\Template
 */
class Client
{
    /**
     * 运行
     */
    public function run()
    {
        $xiaomi = new Xiaomi();
        $xiaomi->action();

        echo '<hr>';

        $huawei = new Huawei();
        $huawei->action();
    }
}

$client = new Client();
$client->run();


从代码中我们可以看出;
在抽象类中使用了 final 这是模板方法标志性的关键字;
它决定了执行的顺序等行为只能由父级抽象类决定;
而子类只需要完成具体的操作内容;
模板方法模式
github示例:https://github.com/baijunyao/design-patterns/tree/master/Template

白俊遥博客
请先登录后发表评论
  • latest comments
  • 总共3条评论
白俊遥博客

大智若愚 :[白俊瑶]

2018-11-14 09:47:10 回复

白俊遥博客

大智若愚 白俊遥博客

2018-11-14 09:45:30 回复

白俊遥博客

Allen 白俊遥博客依赖注入:https://www.cnblogs.com/painsOnline/p/5138806.html

2018-11-05 00:23:45 回复