Facade 设计模式
目的
- 在一个子系统的一组接口上提供一个统一的接口。Facade 设计模式定义了一个更高级别的接口,使子系统更容易使用。
- 通过一个更加简洁的接口来包装一个复杂的子系统。
解决的问题
客户端需要一个简化的接口来覆盖复杂的子系统的总体功能。
讨论
Facade 设计模式通过一个单一的接口对象来封装一个复杂的子系统。这样减少了学习子系统复杂的学习曲线。它也实现了不同潜在客户端的低依赖性和解耦。换句话说,如果Facade 是唯一访问子系统的入口,那么它将限制一些特性何灵活性,那样则可能需要所谓的高级用户。
Facade对象应该是一个相当简单的倡导者或是服务商。它不应该成为一个无所不知的圣人或“上帝”对象。
架构
Facade 采取了一种"被神秘的事物遮蔽起来的东西"的策略, 然后插入了一个包装器来驯服无形的神秘的一团软件.

SubsystemOne 与 SubsystemThree 并不与内部组件SubsytemTwo进行交互,而是通过 SubsystemTwoWrapper 这个 Facade(例如,更高层次的抽象)。

举例
Facade 定义了统一的,高层次的接口以便于非常容易地使用子系统。举例,顾客经常会遇到这样的问题,如从商品目录中订购产品。当用户拨打电话并向客户前台沟通时,这时客户前台便充当Facade的角色,她提供了一个接口去查询订单执行部门,账单部门和商品运送部门。

总结
- 为子系统或组件确定一个简单,统一的接口。
- 设计一个"wrapper"类来封装子系统。
- Facade或wapper封装了组件的协作何复杂性,并委托合适的方法。
- 客户端只能通过Facade访问子系统。
- 考虑额外的Facade是否会增加价值。
规则
Facade 定义了一个全新的接口,而适配器模式使用已存在的接口,适配器的目的是使两个存在的接口在一起工作而不是定义一个全新的接口。
享元模式用来展示多个小的对象,而Facade用单一对象来呈现整个子系统。
中介者模式与Facade类似,它是存在的class的一种抽象,抽象和集中任意同事对象之间的通信。它千篇一律的添加功能,并被同事对象所知和引用。相反,Facade 为子系统定义了一个简单的接口,它并不添加新的功能,并且不被子系统的类所知。
抽象工厂模式可以作为Facade的一种替代来隐藏平台指定的类。
Facade通常设计成单例模式因为只需要一个Facade对象。
适配器模式和Facade都使用了封装器,但他们属于不同的封装。Facade的目的是产生一个简单的接口,而适配器的目的是设计一个存在的接口。Facade通常用来封装多个对象而适配器模式封装一个对象。Facade可以设计一个从前台到后台一个单一复杂的对象而适配器模式封装系统存在的对象。
Facade 设计模式的更多相关文章
- 23种设计模式(1)-Facade设计模式
前记 曾经我遇见的一个需求是这样的,接口A有个方法void methodA(),类B需要实现接口A的methodA()方法,并且在类B中需要把methodA()方法内部处理逻辑获得的结果利用C类实例的 ...
- Facade设计模式
Facade模式 Facade模式要求一个子系统的外部与其内部的通信必须通过一个统一的Facade对象进行.Facade模式提供一个高层次的接口,使得子系统更易于使用. 就如同医院的接待员一样,Fac ...
- 了解facade设计模式
Facade模式 Facade模式要求一个子系统的外部与其内部的通信必须通过一个统一的Facade对象进行.Facade模式提供一个高层次的接口,使得子系统更易于使用. 就如同医院的接待员一样,Fac ...
- (转载)设计模式学习笔记(十一)——Facade外观模式
(转载)http://www.cnblogs.com/kid-li/archive/2006/07/10/446904.html Facade外观模式,是一种结构型模式,它主要解决的问题是:组件的客户 ...
- C#设计模式之十一外观模式(Facade)【结构型】
一.引言 快12点半了,要开始今天的写作了.很快,转眼设计模式已经写了十个了,今天我们要讲[结构型]设计模式的第五个模式,该模式是[外观模式],英文名称是:Facade Pattern.我们先从名字上 ...
- C#设计模式之十外观模式(Facade Pattern)【结构型】
一.引言 快12点半了,要开始今天的写作了.很快,转眼设计模式已经写了十个了,今天我们要讲[结构型]设计模式的第五个模式,该模式是[外观模式],英文名称是:Facade Pattern.我们先从名字上 ...
- C++设计模式 之 “接口隔离” 模式:Facade、Proxy、Mediator、Adapter
“接口隔离”模式 在组建构建过程中,某些接口之间之间的依赖常常会带来很多问题.甚至根本无法实现.采用添加一层间接(稳定)接口,来隔离本来相互紧密关联的接口是一种常见的解决方案. 典型模式 #Facad ...
- c#设计模式之:外观模式(Facade)
一.引言 在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化,然而为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 ...
- 设计模式10: Facade 外观模式(结构型模式)
Facade 外观模式(结构型模式) 系统的复杂度 假设我们要开发一个坦克模式系统用于模拟坦克车在各种作战环境中的行为,其中坦克系统由引擎.控制器.车轮.车身等各个子系统构成. internal cl ...
随机推荐
- Camtasia Studio CamStudio如何不录制鼠标
在录制的小窗口中,点击Effects-Options,然后Cursor里面取消勾选Make cursor effects 可能会报错说请选择有效的声音文件 在Sound里面选择一个有效的目录,不能 ...
- SpringMVC框架使用注解执行定时任务(转)
首先要配置我们的SpringMVC文件 xmlns 加下面的内容: xmlns:task="http://www.springframework.org/schema/task" ...
- android中使用setOnKeyListener响应输入事件
在界面中添加一个EditText输入框控件,需要在输入时响应输入事件,可以使用setOnKeyListener() 事件: final EditText editText = findViewById ...
- iOS 中基础字符判断函数收集(如判断大小写、数字等)
函数:isdigit 用法:#include 功能:判断字符c是否为数字 说明:当c为数字0-9时,返回非零值,否则返回零. 函数:islower 用法:#include 功能:判断字符c是否为小写英 ...
- iOS 两个应用之间的切换
A 跳到B NSURL *urlT = [NSURL URLWithString:@"TestB://XXXXXXX"]; //注意“://”后面可以任意传参数.这些参数传过去后当 ...
- common.js 2017
String.IsNullOrEmpty = function (v) { return !(typeof (v) === "string" && v.length ...
- 使用PyInstaller打包Python角本为exe程序
一.经过测试 在Windows平台请使用Windows平台的pyinstaller,Linux平台请使用Linux平台的Pyinstall角本. 二.命令如下: pyinstaller -F --ic ...
- kafka性能测试(转)KAFKA 0.8 PRODUCER PERFORMANCE
来自:http://blog.liveramp.com/2013/04/08/kafka-0-8-producer-performance-2/ At LiveRamp, we constantly ...
- 【Zookeeper】源码分析之持久化(三)之FileTxnSnapLog
一.前言 前面分析了FileSnap,接着继续分析FileTxnSnapLog源码,其封装了TxnLog和SnapShot,其在持久化过程中是一个帮助类. 二.FileTxnSnapLog源码分析 2 ...
- Java ThreadLocal (Java代码实战-006)
ThreadLocal解决什么问题 由于 ThreadLocal 支持范型,如 ThreadLocal< StringBuilder >,为表述方便,后文用 变量 代表 ThreadLoc ...