外观模式又叫门面模式;
现在都是模块化开发了;
开发中很多时候都是在使用各种扩展包;
或者在外观模式中我们叫做子系统;
外观模式的作用就是减少子系统之间的耦合;
降低子系统的使用难度;
我们举个栗子;
实现一个加密文件内容的功能;
这个功能分为两部分;
如果我们每次都直接调用这两个类;
那耦合就有点高了;
这时候我们就加一层外观 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群及捐赠渠道
最新评论