学习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 相关文章推荐
模拟xcopy的函数
Oct 09 PHP
mysql_fetch_assoc和mysql_fetch_row的功能加起来就是mysql_fetch_array
Jan 15 PHP
php快速url重写 更新版[需php 5.30以上]
Apr 20 PHP
PHP CodeBase:将时间显示为&quot;刚刚&quot;&quot;n分钟/小时前&quot;的方法详解
Jun 06 PHP
PHP加密函数 Javascript/Js 解密函数
Sep 23 PHP
php对称加密算法示例
May 07 PHP
PHP遍历目录并返回统计目录大小
Jun 09 PHP
PHP两种实现无级递归分类的方法
Mar 02 PHP
php json相关函数用法示例
Mar 28 PHP
浅析PHP类的反射来实现依赖注入过程
Feb 06 PHP
Laravel修改验证提示信息为中文的示例
Oct 23 PHP
Yii框架自定义数据库操作组件示例
Nov 11 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
discuz论坛 用户登录 后台程序代码
2008/11/27 PHP
PHP排序算法类实例
2015/06/17 PHP
php实现在站点里面添加邮件发送的功能
2020/04/28 PHP
yii2带搜索功能的下拉框实例详解
2016/05/12 PHP
Laravel框架用户登陆身份验证实现方法详解
2017/09/14 PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
2017/11/17 PHP
PHP7基于curl实现的上传图片功能
2018/05/11 PHP
PHPStudy下如何为Apache安装SSL证书的方法步骤
2019/01/23 PHP
IE6中使用position导致页面变形的解决方案(js代码)
2011/01/09 Javascript
jQuery基本过滤选择器使用介绍
2013/04/18 Javascript
js使用DOM操作实现简单留言板的方法
2015/04/10 Javascript
jQuery实现简单的DIV拖动效果
2016/02/19 Javascript
Jquery判断form表单数据是否变化
2016/03/30 Javascript
Angular2.js实现表单验证详解
2017/06/23 Javascript
vue 中directive功能的简单实现
2018/01/05 Javascript
AngularJS中ng-options实现下拉列表的数据绑定方法
2018/08/13 Javascript
Python的Flask框架中web表单的教程
2015/04/20 Python
21行Python代码实现拼写检查器
2016/01/25 Python
基础的十进制按位运算总结与在Python中的计算示例
2016/06/28 Python
python爬虫实战之最简单的网页爬虫教程
2017/08/13 Python
django限制匿名用户访问及重定向的方法实例
2018/02/07 Python
python简单操作excle的方法
2018/09/12 Python
Python 获取div标签中的文字实例
2018/12/20 Python
PyQt5响应回车事件的方法
2019/06/25 Python
用python打印1~20的整数实例讲解
2019/07/01 Python
pandas 如何分割字符的实现方法
2019/07/29 Python
对Pytorch神经网络初始化kaiming分布详解
2019/08/18 Python
CSS3+font字体文件实现圆形半透明菜单具体步骤(图解)
2013/06/03 HTML / CSS
CSS3+Sprite实现僵尸行走动画特效源码
2016/01/27 HTML / CSS
html5文本内容_动力节点Java学院整理
2017/07/11 HTML / CSS
.NET面试题:什么是值类型和引用类型
2016/01/12 面试题
数控技术学生的自我评价
2014/02/15 职场文书
数学高效课堂实施方案
2014/03/29 职场文书
我有一个梦想演讲稿
2014/05/05 职场文书
校本培训个人总结
2015/02/28 职场文书
基于Python的EasyGUI学习实践
2021/05/07 Python