学习php设计模式 php实现门面模式(Facade)


Posted in PHP onDecember 07, 2015

一、意图
为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层次的接口,使得子系统更加容易使用【GOF95】
外部与子系统的通信是通过一个门面(Facade)对象进行。
二、门面模式结构图

学习php设计模式 php实现门面模式(Facade)

三、门面模式中主要角色
门面(Facade)角色:
此角色将被客户端调用
知道哪些子系统负责处理请求
将用户的请求指派给适当的子系统

子系统(subsystem)角色:
实现子系统的功能
处理由Facade对象指派的任务
没有Facade的相关信息,可以被客户端直接调用
可以同时有一个或多个子系统,每个子系统都不是一个单独的类,而一个类的集合。每个子系统都可以被客户端直接调用,或者被门面角色调用。子系统并知道门面模式的存在,对于子系统而言,门面仅仅是另一个客户端。
四、门面模式的优点
1、它对客户屏蔽了子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便
2、实现了子系统与客户之间的松耦合关系
3、如果应用需要,它并不限制它们使用子系统类。因此可以在系统易用性与能用性之间加以选择
五、门面模式适用场景
1、为一些复杂的子系统提供一组接口
2、提高子系统的独立性
3、在层次化结构中,可以使用门面模式定义系统的每一层的接口
六、门面模式与其它模式
抽象工厂模式(abstract factory模式):
Abstract Factory模式可以与Facade模式一起使用以提供一个接口,这一接口可用来以一种子系统独立的方式创建子系统对象。Abstract Factory模式也可以代替Facade模式隐藏那些与平台相关的类
调停者模式:Mediator模式与Facade模式的相似之处是,它抽象了一些已有类的功能。然而,Mediator目的是对同事之间的任意通讯进行抽象,通常集中不属于任何单个对象的功能。Mediator的同事对象知道中介者并与它通信,而不是直接与其他同类对象通信。相对而言,Facade模式仅对子系统对象的接口进行抽象,从而使它们更容易使用;它并定义不功能,子系统也不知道facade的存在
单例模式(singleton模式):一般来说,仅需要一个Facade对象,因此Facade对象通常属于Singleton对象。
七、门面模式PHP示例

<?php
class Camera {
 
 /**
  * 打开录像机
  */
 public function turnOn() {
  echo 'Turning on the camera.<br />';
 }
 
 /**
  * 关闭录像机
  */
 public function turnOff() {
  echo 'Turning off the camera.<br />';
 }
 
 /**
  * 转到录像机
  * @param <type> $degrees
  */
 public function rotate($degrees) {
  echo 'rotating the camera by ', $degrees, ' degrees.<br />';
 }
}
 
class Light {
 
 /**
  * 开灯
  */
 public function turnOn() {
  echo 'Turning on the light.<br />';
 }
 
 /**
  * 关灯
  */
 public function turnOff() {
  echo 'Turning off the light.<br />';
 }
 
 /**
  * 换灯泡
  */
 public function changeBulb() {
  echo 'changing the light-bulb.<br />';
 }
}
 
class Sensor {
 
 /**
  * 启动感应器
  */
 public function activate() {
  echo 'Activating the sensor.<br />';
 }
 
 /**
  * 关闭感应器
  */
 public function deactivate() {
  echo 'Deactivating the sensor.<br />';
 }
 
 /**
  * 触发感应器
  */
 public function trigger() {
  echo 'The sensor has been trigged.<br />';
 }
}
 
class Alarm {
 
 /**
  * 启动警报器
  */
 public function activate() {
  echo 'Activating the alarm.<br />';
 }
 
 /**
  * 关闭警报器
  */
 public function deactivate() {
  echo 'Deactivating the alarm.<br />';
 }
 
 /**
  * 拉响警报器
  */
 public function ring() {
  echo 'Ring the alarm.<br />';
 }
 
 /**
  * 停掉警报器
  */
 public function stopRing() {
  echo 'Stop the alarm.<br />';
 }
}
 
/**
 * 门面类
 */
class SecurityFacade {
 
 /* 录像机 */
 private $_camera1, $_camera2;
 
 /* 灯 */
 private $_light1, $_light2, $_light3;
 
 /* 感应器 */
 private $_sensor;
 
 /* 警报器 */
 private $_alarm;
 
 public function __construct() {
  $this->_camera1 = new Camera();
  $this->_camera2 = new Camera();
 
  $this->_light1 = new Light();
  $this->_light2 = new Light();
  $this->_light3 = new Light();
 
  $this->_sensor = new Sensor();
  $this->_alarm = new Alarm();
 }
 
 public function activate() {
  $this->_camera1->turnOn();
  $this->_camera2->turnOn();
 
  $this->_light1->turnOn();
  $this->_light2->turnOn();
  $this->_light3->turnOn();
 
  $this->_sensor->activate();
  $this->_alarm->activate();
 }
 
 public function deactivate() {
  $this->_camera1->turnOff();
  $this->_camera2->turnOff();
 
  $this->_light1->turnOff();
  $this->_light2->turnOff();
  $this->_light3->turnOff();
 
  $this->_sensor->deactivate();
  $this->_alarm->deactivate();
 }
}
 
 
/**
 * 客户端
 */
class Client {
 
 private static $_security;
  /**
  * Main program.
  */
 public static function main() {
  self::$_security = new SecurityFacade();
  self::$_security->activate();
 }
}
 
Client::main();
?>

以上就是使用php实现门面模式的代码,还有一些关于门面模式的概念区分,希望对大家的学习有所帮助。

PHP 相关文章推荐
PHP企业级应用之常见缓存技术篇
Jan 27 PHP
ThinkPHP使用PHPExcel实现Excel数据导入导出完整实例
Jul 22 PHP
php下pdo的mysql事务处理用法实例
Dec 27 PHP
php实现excel中rank函数功能的方法
Jan 20 PHP
php结合正则批量抓取网页中邮箱地址
May 19 PHP
PHP可变变量学习小结
Nov 29 PHP
PHP扩展Memcache分布式部署方案
Dec 06 PHP
WordPress中访客登陆实现邮件提醒的PHP脚本实例分享
Dec 14 PHP
Yii rules常用规则示例
Mar 15 PHP
CI框架的安全性分析
May 18 PHP
PHP使用Redis实现Session共享的实现示例
May 12 PHP
PHP PDO和消息队列的个人理解与应用实例分析
Nov 25 PHP
php实现smarty模板无限极分类的方法
Dec 07 #PHP
学习php设计模式 php实现单例模式(singleton)
Dec 07 #PHP
学习php设计模式 php实现桥梁模式(bridge)
Dec 07 #PHP
学习php设计模式 php实现装饰器模式(decorator)
Dec 07 #PHP
PHP函数func_num_args用法实例分析
Dec 07 #PHP
学习php设计模式 php实现抽象工厂模式
Dec 07 #PHP
php计划任务之验证是否有多个进程调用同一个job的方法
Dec 07 #PHP
You might like
php之对抗Web扫描器的脚本技巧
2008/10/01 PHP
php Memcache 中实现消息队列
2009/11/24 PHP
PHP得到mssql的存储过程的输出参数功能实现
2012/11/23 PHP
PHP中VC6、VC9、TS、NTS版本的区别与用法详解
2013/10/26 PHP
PHP中把有符号整型转换为无符号整型方法
2015/05/27 PHP
PHP的Trait机制原理与用法分析
2019/10/18 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
2020/02/21 PHP
关于IFRAME 自适应高度的研究
2006/07/20 Javascript
jQuery :nth-child前有无空格的区别分析
2011/07/11 Javascript
Extjs改变树节点的勾选状态点击按钮将复选框去掉
2013/11/14 Javascript
禁止iframe脚本弹出的窗口覆盖了父窗口的方法
2014/09/06 Javascript
JS实现可展开折叠层的鼠标拖曳效果
2015/10/09 Javascript
jquery 禁止鼠标右键并监听右键事件
2017/04/27 jQuery
Angular2.js实现表单验证详解
2017/06/23 Javascript
详解vue.js+UEditor集成 [前后端分离项目]
2017/07/07 Javascript
js中url对象化管理分析
2017/12/29 Javascript
把vue-router和express项目部署到服务器的方法
2018/02/21 Javascript
JavaScript调用模式与this关键字绑定的关系
2018/04/21 Javascript
jQuery简单实现根据日期计算星期几的方法
2019/01/09 jQuery
详细教你微信公众号正文页SVG交互开发技巧
2019/07/25 Javascript
JavaScript基于用户照片姓名生成海报
2020/05/29 Javascript
Javascript实现贪吃蛇小游戏(含详细注释)
2020/10/23 Javascript
编写Python脚本使得web页面上的代码高亮显示
2015/04/24 Python
在Python web中实现验证码图片代码分享
2017/11/09 Python
Python列表生成式与生成器操作示例
2018/08/01 Python
在python下实现word2vec词向量训练与加载实例
2020/06/09 Python
Expedia挪威官网:酒店、机票和租车
2018/03/03 全球购物
为有想象力的人提供的生活方式商店:Firebox
2018/06/04 全球购物
在Java开发中如何选择使用哪种集合类
2016/08/09 面试题
个人求职自荐信范文
2015/03/06 职场文书
大学迎新生欢迎词
2015/09/29 职场文书
公安纪律作风整顿心得体会
2016/01/23 职场文书
Python爬虫之爬取二手房信息
2021/04/27 Python
Python 快速验证代理IP是否有效的方法实现
2021/07/15 Python
面试中canvas绘制图片模糊图片问题处理
2022/03/13 Javascript
CDPR谈《巫师》新作用虚幻5原因 称不会为Epic独占
2022/04/06 其他游戏