学习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支持页面回退的两种方法[转]
Feb 14 PHP
PHP 高级课程笔记 面向对象
Jun 21 PHP
PHP FTP操作类代码( 上传、拷贝、移动、删除文件/创建目录)
May 10 PHP
PHP实现文件下载断点续传详解
Oct 15 PHP
php不使用copy()函数复制文件的方法
Mar 13 PHP
PHP实现即时输出、实时输出内容方法
May 27 PHP
PHP定时执行任务实现方法详解(Timer)
Jul 30 PHP
PHPStrom 新建FTP项目以及在线操作教程
Oct 16 PHP
详解php中 === 的使用
Oct 24 PHP
PHP利用Socket获取网站的SSL证书与公钥
Jun 18 PHP
PHP自定义函数判断是否为Get、Post及Ajax提交的方法
Jul 27 PHP
Laravel框架实现修改登录和注册接口数据返回格式的方法
Aug 17 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
如何限制访问者的ip(PHPBB的代码)
2006/10/09 PHP
优化PHP代码技巧的小结
2013/06/02 PHP
探讨php中header的用法详解
2013/06/07 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
2017/11/16 PHP
PHP PDOStatement::getColumnMeta讲解
2019/02/01 PHP
Javascript this关键字使用分析
2008/10/21 Javascript
lyhucSelect基于Jquery的Select数据联动插件
2011/03/29 Javascript
原生javascript实现无间缝滚动示例
2014/01/28 Javascript
JS替换文本域内的回车示例
2014/02/18 Javascript
JS实现表格数据各种搜索功能的方法
2015/03/03 Javascript
jQuery使用before()和after()在元素前后添加内容的方法
2015/03/26 Javascript
javascript中select下拉框的用法总结
2016/01/07 Javascript
深入理解requestAnimationFrame的动画循环
2016/09/20 Javascript
Bootstrap 3 进度条的实现
2017/02/22 Javascript
基于nodejs实现微信支付功能
2017/12/20 NodeJs
vue页面加载闪烁问题的解决方法
2018/03/28 Javascript
swiper 自动图片无限轮播实现代码
2018/05/21 Javascript
Vue-component全局注册实例
2018/09/06 Javascript
Element UI框架中巧用树选择器的实现
2018/12/12 Javascript
Vue实现简单分页器
2018/12/29 Javascript
微信小程序云开发如何实现数据库自动备份实现
2019/08/16 Javascript
vue实现带过渡效果的下拉菜单功能
2020/02/19 Javascript
[03:38]2014DOTA2西雅图国际邀请赛 VG战队巡礼
2014/07/07 DOTA
[00:12]2018DOTA2亚洲邀请赛 Somnus丶M出阵单挑
2018/04/06 DOTA
[01:19:46]DOTA2-DPC中国联赛 正赛 SAG vs DLG BO3 第一场 2月28日
2021/03/11 DOTA
python+mongodb数据抓取详细介绍
2017/10/25 Python
利用python提取wav文件的mfcc方法
2019/01/09 Python
通过python的matplotlib包将Tensorflow数据进行可视化的方法
2019/01/09 Python
一些Unix笔试题和面试题
2012/09/25 面试题
英文自荐信常用句子
2014/03/26 职场文书
建筑工地标语
2014/06/18 职场文书
个人先进事迹材料范文
2014/12/29 职场文书
2015年幼儿园后勤工作总结
2015/04/25 职场文书
出生证明范本
2015/06/15 职场文书
写好Python代码的几条重要技巧
2021/05/21 Python
Python 内置函数速查表一览
2021/06/02 Python