组合型的设计模式本质是使用组合替代继承;
但是继承并非一无是处;
只是因为大家容易滥用继承造成强耦合;
作为面向对象编程的三大特性之一;
继承还是很有价值的;
比如说本篇文章要讲的模板方法模式;
就是依赖于继承来实现;
结构
抽象类: 定义操作中骨架;比如说执行顺序等;讲具体的执行内容延迟到子类;
子类: 定义具体的执行内容;
示例
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 '开机' . '
';
}
/**
* logo
*
* @return mixed
*/
abstract protected function showLogo();
/**
* 打电话
*/
protected function callUp()
{
echo '打电话' . '
';
}
}
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'. '
';
}
}
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'. '
';
}
}
运行;
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 '
';
$huawei = new Huawei();
$huawei->action();
}
}
$client = new Client();
$client->run();
从代码中我们可以看出;
在抽象类中使用了 final 这是模板方法标志性的关键字;
它决定了执行的顺序等行为只能由父级抽象类决定;
而子类只需要完成具体的操作内容;
github示例:https://github.com/baijunyao/design-patterns/tree/master/Template