php设计模式(十五)外观模式

外观模式又叫门面模式;
现在都是模块化开发了;
开发中很多时候都是在使用各种扩展包;
或者在外观模式中我们叫做子系统;
外观模式的作用就是减少子系统之间的耦合;
降低子系统的使用难度;
我们举个栗子;
实现一个加密文件内容的功能;
这个功能分为两部分;

  1. 用于从文本文件中读取内容的 File 类
  2. 用于加密内容的 Encrypt 类

如果我们每次都直接调用这两个类;
那耦合就有点高了;
这时候我们就加一层外观 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

外观模式

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

星辰大海 :可不可以这个只为加密服务,增加其他的子系统的话重新写一个外观模式

2018-11-20 15:56:26 回复

白俊遥博客

陈同学 :白大神换个友情链接。http://www.chenkui102.com

2018-10-20 20:50:44 回复

白俊遥博客 白俊遥博客

云淡风晴 :可以在 https://baijunyao.com/site 中自助申请;

2018-10-20 21:41:50 回复

白俊遥博客

YB ღ :白老大讲的666呀

2018-10-15 18:10:04 回复