学习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 相关文章推荐
Gregarius中文日期格式问题解决办法
Apr 22 PHP
php 操作符与控制结构
Mar 07 PHP
PHP 处理TXT文件(打开/关闭/检查/读取)
May 13 PHP
php中将数组转成字符串并保存到数据库中的函数代码
Sep 29 PHP
php导出csv数据在浏览器中输出提供下载或保存到文件的示例
Apr 24 PHP
php防止sql注入之过滤分页参数实例
Nov 03 PHP
php内嵌函数用法实例
Mar 20 PHP
php递归遍历多维数组的方法
Apr 18 PHP
php使用file函数、fseek函数读取大文件效率对比分析
Nov 04 PHP
php获取flash尺寸详细数据的方法
Nov 12 PHP
PHP正则匹配反斜杠'\'和美元'$'的方法
Feb 08 PHP
使用Git实现Laravel项目的自动化部署
Nov 24 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下几种删除目录的方法总结
2007/08/19 PHP
PHP 源代码压缩小工具
2009/12/22 PHP
php设计模式  Command(命令模式)
2011/06/17 PHP
javascript html 静态页面传参数
2009/04/10 Javascript
基于jquery的跟随屏幕滚动代码
2012/07/24 Javascript
JQuery+DIV自定义滚动条样式的具体实现
2013/06/25 Javascript
JS中图片缓冲loading技术的实例代码
2013/08/29 Javascript
Javascript核心读书有感之类型、值和变量
2015/02/11 Javascript
使用jquery制作弹出框效果
2015/04/03 Javascript
JS中parseInt()和map()用法分析
2016/12/16 Javascript
lhgcalendar时间插件限制只能选择三个月的实现方法
2017/07/03 Javascript
vue 自定义组件 v-model双向绑定、 父子组件同步通信的多种写法
2017/11/27 Javascript
webstorm中配置nodejs环境及npm的实例
2018/05/15 NodeJs
JavaScript 下载svg图片为png格式
2018/06/21 Javascript
解决js相同的正则多次调用test()返回的值却不同的问题
2018/10/10 Javascript
Python 第一步 hello world
2009/09/25 Python
Python Web框架Flask中使用百度云存储BCS实例
2015/02/08 Python
Python下Fabric的简单部署方法
2015/07/14 Python
Python文件监听工具pyinotify与watchdog实例
2018/10/15 Python
Python实现将通信达.day文件读取为DataFrame
2018/12/22 Python
pyqt5 tablewidget 利用线程动态刷新数据的方法
2019/06/17 Python
Python中查看变量的类型内存地址所占字节的大小
2019/06/26 Python
一篇文章搞定Python操作文件与目录
2019/08/13 Python
如何基于Python获取图片的物理尺寸
2019/11/25 Python
python序列类型种类详解
2020/02/26 Python
浅谈python元素如何去重,去重后如何保持原来元素的顺序不变
2020/02/28 Python
基于K.image_data_format() == 'channels_first' 的理解
2020/06/29 Python
Python入门基础之数字字符串与列表
2021/02/01 Python
python Protobuf定义消息类型知识点讲解
2021/03/02 Python
Ray-Ban雷朋瑞典官方网站:全球领先的太阳眼镜品牌
2019/08/22 全球购物
北京华建集团SQL面试题
2014/06/03 面试题
北京某科技有限公司C# .net笔试题
2014/09/27 面试题
财务检查整改报告
2014/11/06 职场文书
2014年售票员工作总结
2014/11/19 职场文书
uniapp开发小程序的经验总结
2021/04/08 Javascript
集英社今正式宣布 成立游戏公司“集英社Games”
2022/03/31 其他游戏