学习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模拟HTTP认证
Oct 09 PHP
php和mysql中uft-8中文编码乱码的几种解决办法
Apr 19 PHP
php处理文件的小例子(解压缩,删除目录)
Feb 03 PHP
基于PHPExcel的常用方法总结
Jun 13 PHP
PHP常用技术文之文件操作和目录操作总结
Sep 27 PHP
smarty半小时快速上手入门教程
Oct 27 PHP
PHP缓存集成库phpFastCache用法
Dec 15 PHP
thinkPHP数据库增删改查操作方法实例详解
Dec 06 PHP
PHP 实现字符串翻转(包含中文汉字)的实现代码
Apr 01 PHP
PHP排序算法之堆排序(Heap Sort)实例详解
Apr 21 PHP
PHP实现用户登录的案例代码
May 10 PHP
PHP实现数据四舍五入的方法小结【4种方法】
Mar 27 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
WINDOWS下php5.2.4+mysql6.0+apache2.2.4+ZendOptimizer-3.3.0配置
2008/03/28 PHP
PHP里8个鲜为人知的安全函数分析
2014/12/09 PHP
js获取select标签选中值的两种方式
2014/01/09 Javascript
js简单实现交换Li的值
2014/05/22 Javascript
JQuery 使用attr方法实现下拉列表选中
2014/10/13 Javascript
用原生JS获取CLASS对象(很简单实用)
2014/10/15 Javascript
jQuery+jRange实现滑动选取数值范围特效
2015/03/14 Javascript
jQuery实现打开页面渐现效果示例
2016/07/27 Javascript
js表单元素checked、radio被选中的几种方法(详解)
2016/08/22 Javascript
Bootstrap字体图标无法正常显示的解决方法
2016/10/08 Javascript
canvas绘制万花筒效果(代码分享)
2017/01/20 Javascript
完美解决手机浏览器顶部下拉出现网页源或刷新的问题
2017/11/30 Javascript
vue渲染时闪烁{{}}的问题及解决方法
2018/03/28 Javascript
在小程序中集成redux/immutable/thunk第三方库的方法
2018/08/12 Javascript
微信小程序中网络请求缓存的解决方法
2019/12/29 Javascript
JS异步宏队列与微队列原理区别详解
2020/07/02 Javascript
vue中使用腾讯云Im的示例
2020/10/23 Javascript
vue keep-alive的简单总结
2021/01/25 Vue.js
详解Python下Flask-ApScheduler快速指南
2018/11/04 Python
Pandas Shift函数的基础入门学习笔记
2018/11/16 Python
python pptx复制指定页的ppt教程
2020/02/14 Python
Python模块zipfile原理及使用方法详解
2020/08/04 Python
Django修改app名称和数据表迁移方案实现
2020/09/17 Python
移动端开发HTML5页面点击按钮后出现闪烁或黑色背景的解决办法
2018/09/19 HTML / CSS
香蕉共和国加拿大官网:Banana Republic加拿大
2018/08/06 全球购物
.NET remoting中对象激活的两种方式
2015/06/08 面试题
护士自我鉴定范文
2013/10/06 职场文书
财政局长自荐信范文
2013/12/22 职场文书
海飞丝的广告词
2014/03/20 职场文书
财务部绩效考核方案
2014/05/04 职场文书
关于梦想的演讲稿
2014/05/05 职场文书
给校长的建议书300字
2014/05/16 职场文书
2014年度个人工作总结
2014/11/07 职场文书
2014年电厂工作总结
2014/12/04 职场文书
党员违纪检讨书
2015/05/05 职场文书
SQL实现LeetCode(178.分数排行)
2021/08/04 MySQL