前言

门面模式(Facade)又称外观模式,用于为子系统中的一组接口提供一个一致的界面。门面模式定义了一个高层接口,这个接口使得子系统更加容易使用:引入门面角色之后,用户只需要直接与门面角色交互,用户与子系统之间的复杂关系由门面角色来实现,从而降低了系统的耦合度。

打个比方,比如我们要在淘宝买东西,我基本上只需要鼠标点一些按钮就完成了。

但是实际上网站的后台是 很多个子系统一起去完成 你购买商品的任务的,比如网站系统,购物车系统,订单系统,用户中心系统,支付系统。

这些系统 对外通过了统一的接口,让你在网站上点按钮就可以完成买东西的需求。这就是门面模式。我的理解起这个名称的人关注的是由多个接口不统一的子系统对外提供统一的接口,好像形成了一个界面或者门面一样。

能做什么?

  • 为一些复杂的子系统提供一组接口。
  • 提高子系统的独立性。
  • 在层次化结构中,可以使用门面模式定义系统的每一层的接口。

有什么优势?

  • 它对客户屏蔽了子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便。
  • 实现了子系统与客户之间的松耦合关系。
  • 如果应用需要,它并不限制它们使用子系统类。因此可以在系统易用性与能用性之间加以选择。

实例(通俗易懂)

下面模拟一个 "用户操作设备" ,你一看就能恍然大悟!

说了这么多理论,你可能感到迷惑,想千遍,不如做一遍!

复制粘贴,跑起来!

<?php/*** 门面设计模式(Facade)* 看不懂你打我!*/class Camera
{/*** 打开录像机*/public function turnOn(){echo "打开录像机" . '<br/>';}/*** 关闭录像机*/public function turnOff(){echo "关闭录像机" . '<br/>';}}class Light
{/*** 开灯*/public function turnOn(){echo "开灯" . '<br/>';}/*** 关灯*/public function turnOff(){echo "关灯" . '<br/>';}/*** 换灯泡*/public function changeBulb(){echo "换灯泡" . '<br/>';}}class Sensor
{/*** 启动感应器*/public function activate(){echo "启动感应器" . '<br/>';}/*** 关闭感应器*/public function deactivate(){echo "关闭感应器" . '<br/>';}/*** 触发感应器*/public function trigger(){echo "触发感应器" . '<br/>';}}class Alarm {/*** 启动警报器*/public function activate(){echo "启动报警器" . '<br/>';}/*** 关闭警报器*/public function deactivate(){echo "关闭报警器" . '<br/>';}/*** 拉响警报器*/public function ring(){echo "拉响报警器" . '<br/>';}/*** 停掉警报器*/public function stopRing(){echo "停掉报警器" . '<br/>';}}/*** 门面类(Facade)* 负责将"分散"的功能提供统一接口*/
class Facade
{/* 录像机 */private $_camera;/* 灯 */private $_light;/* 感应器 */private $_sensor;/* 警报器 */private $_alarm;public function __construct(){$this->_camera = new Camera();$this->_light = new Light();$this->_sensor = new Sensor();$this->_alarm = new Alarm();}/*** 启动接口: (打开录像机/开灯/启动感应器/启动报警器)* @return void*/public function activate(){// 打开录像机$this->_camera -> turnOn();// 开灯$this->_light -> turnOn();// 启动感应器$this->_sensor -> activate();// 启动报警器$this->_alarm -> activate();// 分隔符(方便观察)echo '<hr>';}/*** 关闭接口: (关闭录像机/关灯/关闭感应器/关闭报警器)* @return void*/public function deactivate(){// 关闭录像机$this->_camera -> turnOff();// 关灯$this->_light -> turnOff();// 关闭感应器$this->_sensor -> deactivate();// 关闭报警器$this->_alarm -> deactivate();// 分隔符(方便观察)echo '<hr>';}/*** 其他功能接口: (换灯泡/触发感应器/拉响警报器/停掉警报器)* @return void*/public function otherFunction(){// 换灯泡$this->_light -> changeBulb();// 触发感应器$this->_sensor -> trigger();// 拉响警报器$this->_alarm -> ring();// 停掉警报器$this->_alarm -> stopRing();// 分隔符(方便观察)echo '<hr>';}
}/*** 客户端(由用户触发接口功能)*/
class Client
{private static $_security;/*** 主程序(Main program)* @return void*/public static function main(){   // 实例化门面类(Facade)self::$_security = new Facade();/*** 用户操作(operation)* @activate(): 开启操作* @deactivate(): 关闭操作* @otherFunction(): 其他操作*/self::$_security -> activate();self::$_security -> deactivate();self::$_security -> otherFunction();}
}/*** console main();*/
Client::main();?>

客户端结果:

说白了,就是将复杂的功能统一使用一个接口管理起来!

写在后面

当然,以上示例写在一个文件中 只是为了告诉你什么是门面模式,真正开发中 功能类门面类客户端类,都是分离模块化(不同文件夹与文件),高内聚低耦合嘛。

PHP设计模式 - 门面模式(Facade)通俗易懂 / 友好示例代码相关推荐

  1. 外观模式 门面模式 Facade 结构型 设计模式(十三)

    外观模式(FACADE) 又称为门面模式 意图 为子系统中的一组接口提供一个一致的界面 Facade模式定义了一个高层接口,这一接口使得这一子系统更加易于使用. 意图解析 随着项目的持续发展,系统基本 ...

  2. .net 有哪些主流的设计模式_「设计模式自习室」门面模式 Facade Pattern

    前言 <设计模式自习室>系列,顾名思义,本系列文章带你温习常见的设计模式.主要内容有: 该模式的介绍,包括: 引子.意图(大白话解释) 类图.时序图(理论规范) 该模式的代码示例:熟悉该模 ...

  3. 【设计模式自习室】门面模式 Facade Pattern

    前言 <设计模式自习室>系列,顾名思义,本系列文章带你温习常见的设计模式.主要内容有: 该模式的介绍,包括: 引子.意图(大白话解释) 类图.时序图(理论规范) 该模式的代码示例:熟悉该模 ...

  4. 23种设计模式 UML 类图及对应示例代码 (二)

    23种设计模式 UML 类图及对应示例代码 (二) 11.DoFactory.GangOfFour.Flyweight.Structural Flyweight:运用共享技术有效的支持大量细粒度的对象 ...

  5. 大熊君说说JS与设计模式之(门面模式Facade)迪米特法则的救赎篇------(监狱的故事)...

    一,总体概要 1,笔者浅谈 说起"门面"这个设计模式其实不论新老程序猿都是在无意中就已经运用到此模式了,就像我们美丽的JS程序员一样不经意就使用了闭包处理问题, 1 functio ...

  6. C++设计模式——门面模式(facade pattern)

    一.原理讲解 门面模式也叫做外观模式,实质就是一个封装接口,通常是将一类功能或者一个层次功能用一个函数封装起来,供客户端统一调用. 1.1意图 为子系统中的一组接口提供一个一致的界面,Facade模式 ...

  7. 门面设计模式php,php设计模式-门面模式(Facade Pattern)

    门面模式概念 门面模式,是指提供一个统一的接口去访问多个子系统的多个不同的接口,它为子系统中的一组接口提供一个统一的高层接口.使得子系统更容易使用. 引入门面角色之后,用户只需要直接与门面角色交互,用 ...

  8. 设计模式——门面模式(Facade Pattern)

    定义:门面模式又叫外观模式,提供了一个统一的接口,用来访问子系统中的一群接口.门面模式定义了一个高层接口,让子系统更方便使用.属于结构型模式. 适用场景:子系统越来越复杂,增加门面模式提供简单接口.构 ...

  9. 设计模式-04.02-结构型设计模式-门面模式组合模式享元模式

    文章目录 门面模式(外观模式)[不常用] 门面模式的原理与实现 Demo案例-影院管理 传统方案 门面模式代码 TheaterLight Stereo Screen Projector Popcorn ...

最新文章

  1. 使用 Python 在 GitHub 上运行你的博客
  2. 动态调试android, ddmsida
  3. 【放置奇兵】算法 小恶魔大冒险
  4. 《数据库SQL实战》查找入职员工时间排名倒数第三的员工的所有信息
  5. 3650m5设置u盘启动_系统重装必备神器,U盘如何制作启动盘?
  6. LeetCode#53 Maximum Subarray
  7. Python3.6下安装扩展库pywin32的正确姿势
  8. 为什么需要建设者模式
  9. mysql left join测试
  10. Network in Network 算法解析
  11. MyBatis配置文件
  12. adobe绿色版cs6下载地址
  13. 【clickhouse踩坑记录】clusters表中分片副本的浅析
  14. 2018下半年Android面试历程
  15. 大漠穷秋:一个写代码的浪人|码云封面人物第 17 期
  16. STC8H8K64U——LED灯闪烁
  17. 项目临时变更时,项目经理应该如何应对?
  18. PF-TD2PO1,PF-TD2DV2,PFSO-BT1,PFSO-DTBT1光电中间体材料
  19. vue中将字符转换成数字的简单做法
  20. mysql怎么输出列表的次序_MySQL metalock的一些技巧(写大于读的案例,以及获得锁的顺序)...

热门文章

  1. 2018年上海交通大学数学建模竞赛暑期夏令营讲课课件(完整版)
  2. HDLBITS笔记30:rule 90、rule 100以及Conway‘s game of life 16*16
  3. Java代码韦伯分布_Excel 应用WEIBULL函数计算韦伯分布
  4. 840C - On the Bench (容斥 + DP)
  5. 柯尼卡/KonicaFTP扫描设置
  6. 国防科大计算机专业分数线,国防科技大学有哪些专业 录取分数线一般在多少...
  7. 数据分析--单因子选股策略、多因子选股策略(选股)
  8. 【多线程笔记02】多线程之CyclicBarrier的介绍和使用
  9. shiro用户加密默认方式_shiro中的加密、解密的几种方式
  10. VUE实战-知乎日报(2)