外观模式(Facade)
2016-06-25 17:05
330 查看
一、模式动机
将一个系统划分为若干个子系统有利于降低系统的复杂性,一个常见的设计目标是使子系统间的通信和相互依赖关系达到最小,而达到该目标的途径之一就是引入一个外观对象,它为子系统中较一般的设置提供了一个单一而简单的界面。外观模式要求一个子系统的外部与其内部的通信必须通过一个统一的外观(Facade)对象进行。就如同医院的接待员一样,外观模式的外观类将客户端与子系统的内部复杂性分隔开,使得客户端只需要与外观对象打交道,而不需要与子系统内部的很多对象打交道。
二、模式定义
外观模式(Facade):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式是对象的结构模式。三、模式结构
四、参与者
Facade:外观角色SubSystem:子系统角色
五、示例代码
一个保安系统由两个录像机、三个电灯、一个遥感器和一个警报器组成。保安系统的操作人员需要经常将这些仪器启动和关闭。package design.pattern; class Camera { public void turnOn() { System.out.println("turning on the camera."); } public void turnOff() { System.out.println("turning off the camera."); } } class Light { public void turnOn() { System.out.println("turning on the light."); } public void turnOff() { System.out.println("turning off the light."); } } class Sensor { public void activate() { System.out.println("activating the sensor."); } public void deactivate() { System.out.println("deactivating the sensor."); } } public class Facade { private Camera camera1, camera2; private Light light1, light2; private Sensor sensor; Facade() { camera1 = new Camera(); camera2 = new Camera(); light1 = new Light(); light2 = new Light(); sensor = new Sensor(); } public void activate() { camera1.turnOn(); camera2.turnOn(); light1.turnOn(); light2.turnOff(); sensor.activate(); } public void deactivate() { camera1.turnOff(); camera2.turnOff(); light1.turnOff(); light2.turnOff(); sensor.deactivate(); } public static void main(String[] args) { Facade f = new Facade(); f.activate(); System.out.println(); f.deactivate(); } }
模式结构
优缺点
它对客户屏蔽子系统组件,减少了客户处理的对象数目使得子系统使用起来更加容易。
它实现了子系统与客户之间的松耦合关系。这使得子系统的组件变化不会影响到它的客户。
提高了安全性,通过外观模式,屏蔽子系统业务逻辑。
它简化了系统在不同平台之间的移植过程,因为编译一个子系统一般不需要编译所有其它的子系统。
它并不限制复杂应用使用子系统类。
外观模式并不增加任何功能性模式,它仅仅是一些简单化接口。
模式使用
当要为一个复杂子系统提供一个简单接口时。这个接口对大多数用户来说已经足够好;那些需要更多可定制性的用户可以越过Facade层。
子系统相对独立——外界只需黑箱操作即可。例如利息计算。
预防操作人员带来的风险扩散。
相关文章推荐
- 山不到默罕默德这边来,默罕默德就到山那边去。
- 运输装备(codevs 1669)
- 如何使用eclipse创建Maven工程及其子模块
- JavaScript ----------------- 寄生式继承
- android 源码编译中的错误 解决
- mac 安装xampp如果要用localhost打开apache怎么办
- toolbar使用笔记
- Android UI设计常用尺寸及基本知识
- 剑指offer-面试7:用两个栈实现队列(栈和队列)
- Java Type to SQL Type Mappings
- Ubuntu新版发布周期
- 易语言突破百度云防护
- linux的task_struct结构体
- H5学习笔记之a标签、分组元素
- openstack on centos 7.1(block storage)
- [android] socket在手机上的应用
- git reset revert 回退回滚取消提交返回上一版本
- jsoup爬取百度瀑布流图片
- MySQL5.6导入‘.frm’、‘.MYD’、‘.MYI’
- 类