找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1614|回复: 0
打印 上一主题 下一主题

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

[复制链接]

2500

主题

2513

帖子

7520

积分

论坛元老

Rank: 8Rank: 8

积分
7520
跳转到指定楼层
楼主
发表于 2018-2-14 05:41:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

            一、意图
为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层次的接口,使得子系统更加容易使用【GOF95】
外部与子系统的通信是通过一个门面(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示例
$degrees
  */
public function rotate($degrees) {
  echo 'rotating the camera by ', $degrees, ' degrees.
';
}
}

class Light {

/**
  * 开灯
  */
public function turnOn() {
  echo 'Turning on the light.
';
}

/**
  * 关灯
  */
public function turnOff() {
  echo 'Turning off the light.
';
}

/**
  * 换灯泡
  */
public function changeBulb() {
  echo 'changing the light-bulb.
';
}
}

class Sensor {

/**
  * 启动感应器
  */
public function activate() {
  echo 'Activating the sensor.
';
}

/**
  * 关闭感应器
  */
public function deactivate() {
  echo 'Deactivating the sensor.
';
}

/**
  * 触发感应器
  */
public function trigger() {
  echo 'The sensor has been trigged.
';
}
}

class Alarm {

/**
  * 启动警报器
  */
public function activate() {
  echo 'Activating the alarm.
';
}

/**
  * 关闭警报器
  */
public function deactivate() {
  echo 'Deactivating the alarm.
';
}

/**
  * 拉响警报器
  */
public function ring() {
  echo 'Ring the alarm.
';
}

/**
  * 停掉警报器
  */
public function stopRing() {
  echo 'Stop the alarm.
';
}
}

/**
* 门面类
*/
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设计模式 Proxy (代理模式)
  • php设计模式 Template (模板模式)
  • php设计模式 DAO(数据访问对象模式)
  • php设计模式小结
  • 学习php设计模式 php实现访问者模式(Visitor)
  • 学习php设计模式 php实现建造者模式
  • 学习php设计模式 php实现抽象工厂模式
            
  • 分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    用户反馈
    客户端