一、意图 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层次的接口,使得子系统更加容易使用【GOF95】 外部与子系统的通信是通过一个门面(Facade)对象进行。 二、门面模式结构图 三、门面模式中主要角色 门面(Facade)角色: 此角色将被客户端调用 知道哪些子系统负责处理请求 将用户的请求指派给适当的子系统 子系统(subsystem)角色: 实现子系统的功能 处理由Facade对象指派的任务 没有Facade的相关信息,可以被客户端直接调用 可以同时有一个或多个子系统,每个子系统都不是一个单独的类,而一个类的集合。每个子系统都可以被客户端直接调用,或者被门面 门面模式(Facade Pattern)是一种设计模式,它的主要目的是为了解决复杂系统中各个子系统的交互问题,提供一个简单的统一接口,使得客户端可以更轻松地使用这些子系统。这种模式在PHP开发中非常常见,特别是在处理大型项目或者库时,能够有效降低系统的复杂度。 在门面模式中,有三个主要角色: 1. **门面(Facade)角色**:它是客户端与子系统之间的桥梁,提供了一个统一的接口,使得客户端可以通过这个接口与子系统进行交互。门面角色会根据客户端的需求,将请求分发给相应的子系统。 2. **子系统(Subsystem)角色**:子系统是实际执行任务的组件,可以是一个或多个类的集合。每个子系统都有自己的功能,它们并不依赖于门面,可以独立工作,也可以被客户端直接调用。 3. **客户端(Client)角色**:客户端通过门面角色来访问子系统,无需关心子系统的具体实现,只需要与门面进行交互即可。 门面模式有以下优点: 1. **减少复杂性**:客户端只需与门面交互,避免了与多个子系统组件直接打交道的复杂性。 2. **松耦合**:门面模式使得子系统与客户端之间的耦合度降低,因为客户端只依赖于门面,而不依赖于具体的子系统实现。 3. **扩展性**:如果需要添加新的子系统功能,只需要修改门面的实现,对客户端代码无影响。 门面模式适用于以下场景: 1. 当需要为复杂的子系统提供一个简单易用的接口时。 2. 提高子系统的独立性,使其可以单独测试或替换。 3. 在层次化的系统结构中,每个层级都可以有自己的门面,简化不同层级之间的通信。 门面模式与其他设计模式的关系: - **抽象工厂模式(Abstract Factory)**:两者可以结合使用,抽象工厂模式提供子系统对象的创建,而门面模式提供对这些对象的统一接口。 - **调停者模式(Mediator)**:调停者模式关注的是对象之间的通信,而门面模式关注的是客户端与子系统的通信。 - **单例模式(Singleton)**:通常,一个系统中只有一个门面对象,因此它经常与单例模式结合,确保门面对象的唯一性。 以下是一个PHP的门面模式示例,展示了如何封装和管理多个设备(Camera、Light、Sensor和Alarm)的操作: ```php class Camera { public function turnOn() {...} public function turnOff() {...} public function rotate($degrees) {...} } class Light { public function turnOn() {...} public function turnOff() {...} public function changeBulb() {...} } class Sensor { public function activate() {...} public function deactivate() {...} public function trigger() {...} } class Alarm { public function activate() {...} public function deactivate() {...} } class HomeAutomationFacade { private $camera; private $light; private $sensor; private $alarm; public function __construct() { $this->camera = new Camera(); $this->light = new Light(); $this->sensor = new Sensor(); $this->alarm = new Alarm(); } public function secureHome() { $this->camera->turnOn(); $this->light->turnOn(); $this->sensor->activate(); $this->alarm->activate(); } public function unsecureHome() { $this->camera->turnOff(); $this->light->turnOff(); $this->sensor->deactivate(); $this->alarm->deactivate(); } } // 客户端代码 $homeAutomation = new HomeAutomationFacade(); $homeAutomation->secureHome(); ``` 在这个例子中,`HomeAutomationFacade`是门面角色,它封装了`Camera`、`Light`、`Sensor`和`Alarm`对象的控制逻辑,客户端通过调用`secureHome()`和`unsecureHome()`方法来操作整个家庭自动化系统,而无需了解每个设备的具体实现细节。




























- 粉丝: 3
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 气体灭火系统操作流程图.doc
- 第一章-肥料学基础知识(水产学校2014).ppt
- 材料力学课件之强度理论.ppt
- 北京某办公楼暖通工程施工方案.doc
- 2015年软考《信息系统项目管理师》练习题汇总.doc
- 解读计算机网络信息管理及其安全防护策略.docx
- 日本鹿岛装配式建筑结构技术介绍.pdf
- 电梯安装工程分部工程质量评定表.doc
- 大型交通枢纽工程施工质量创优汇报.ppt
- 环氧树脂混凝土配合比.doc
- 钢木结构的魅力.pptx
- 试论网络环境下的图书馆服务1.docx
- 郑州锅炉厂新厂区锅炉及联合厂房工程施工进度计划3.doc
- 计算机网络技术在高校财务管理中的应用.docx
- 机械电子产品行业程序-采购控制程序.doc
- 软件开发可行性分析报告.doc



评论0