外观模式又叫门面模式;
现在都是模块化开发了;
开发中很多时候都是在使用各种扩展包;
或者在外观模式中我们叫做子系统;
外观模式的作用就是减少子系统之间的耦合;
降低子系统的使用难度;
我们举个栗子;
实现一个加密文件内容的功能;
这个功能分为两部分;
如果我们每次都直接调用这两个类;
那耦合就有点高了;
这时候我们就加一层外观 Facade ;
在 Facade 中来完成文件读取和加密的过程;
在客户端调用的都是 Facade ;
SubSystem: 子系统 示例中指 File  和 Encrypt ;
Facade: 外观对象;
读取文件内容
File.php
<?php
namespace Baijunyao\DesignPatterns\Facade;
/**
 * 文件类
 *
 * @package Baijunyao\DesignPatterns\Facade
 */
class File
{
    /**
     * 获取文件内容
     */
    public function content()
    {
        return '获取文件内容';
    }
}加密
Encrypt.php
<?php
namespace Baijunyao\DesignPatterns\Facade;
/**
 * 加密类
 *
 * @package Baijunyao\DesignPatterns\Facade
 */
class Encrypt
{
    /**
     * 加密
     */
    public function encrypt()
    {
        return '加密';
    }
}外观对象
Facade
<?php
namespace Baijunyao\DesignPatterns\Facade;
/**
 * Facade
 *
 * @package Baijunyao\DesignPatterns\Facade
 */
class Facade
{
    /**
     * @var \Baijunyao\DesignPatterns\Facade\File
     */
    private $file;
    /**
     * @var \Baijunyao\DesignPatterns\Facade\Encrypt
     */
    private $encrypt;
    /**
     * Facade constructor.
     */
    public function __construct()
    {
        $this->file = new File();
        $this->encrypt = new Encrypt();
    }
    /**
     * 获取文件内容并加密
     */
    public function encryptContent()
    {
        echo $this->file->content();
        echo '<br>';
        echo $this->encrypt->encrypt();
    }
}运行;
index.php
<?php
namespace Baijunyao\DesignPatterns\Facade;
require __DIR__.'/../vendor/autoload.php';
/**
 * 客户端
 *
 * Class Client
 * @package Baijunyao\DesignPatterns\Facade
 */
class Client
{
    /**
     * 运行
     */
    public function run()
    {
        $facade = new Facade();
        $facade->encryptContent();
    }
}
$client = new Client();
$client->run();从代码可以看出;
外观模式对客户端屏蔽了子系统;
但是也有缺点;
如果想增加子系统;
就需要修改 Facade ;
这就违反了开闭原则 ;
github示例:https://github.com/baijunyao/design-patterns/tree/master/Facade

本文为白俊遥原创文章,转载无需和我联系,但请注明来自白俊遥博客https://baijunyao.com 欢迎捐赠赞赏加入组织创建QQ群及捐赠渠道
最新评论