结构型模式--FACADE模式(外观)
一. 意图
为子系统中的一组接口提供一个一致的界面, Facade模式定义了一个高层接口, 这个接口使得这一子系统更加容易使用.
二. 适用性
1. 当你要为一个复杂子系统提供一个简单接口时.
Facade可以提供一个简单的缺省视图, 这一视图对大多数用户来说已经足够, 而那些需要更多的可定制性的用户可以越过facade层.
2. 客户程序与抽象类的实现部分之间存在着很大的依赖性. 引入facade将这个子系统与客户以及其他的子系统分离, 可以提高子系统的独立性和可移植性.
3. 当你需要构建一个层次结构的子系统时, 使用facade模式定义子系统中每层的入口点. 如果子系统之间是相互依赖的, 你可以让它们仅通过facade进行通讯, 从而简化了它们之间的依赖关系.
三. 模式结构
图1
四. 角色说明
Facade
—知道哪些子系统类负责处理请求。
—将客户的请求代理给适当的子系统对象。
Subsystem classes
—实现子系统的功能。
—处理由Facade对象指派的任务。
—没有Facade的任何相关信息:即没有指向Facade的指针。
五. 说明
1. 它对客户屏蔽子系统组件
2. 它实现了子系统与客户之间的松耦合关系.
3. 客户也可以直接使用子系统.
六. 我的理解
1. 子系统组件的复杂调用由Facade来负责, Facade提供一个统一的简单的接口给客户使用, Facade接口在调用子系统接口.
2. 就是在客户与子系统之间增加了一层, 增加的这一层简化了客户的调用, 客户与子系统也松耦合了.
例如GDI+ 中, 对C++用户就提供了一层Facade了. GDI+中的的Facade层提供了适合C++调用的接口, 隐藏了GDI+的直接调用.
七. 相关模式
1. Abstract Factory 模式可以与Facade模式一起使用以提供一个接口, 这一接口可用来以一种子系统独立的方式创建子系统对象. Abstract Factory也可以代替Facade模式隐藏那些与平台相关的类.
2. Mediator模式与Facade模式的相似之处是, 它抽象了一些已有的类的功能. 然而, Mediator的目的是对同事之间的任意通讯进行抽象, 通常集中不属于任何单个对象的功能. Mediator的同事对象知道中介者并与它通信, 而不是直接与其他同类对象通信. 相对而言, Facade模式仅对子系统对象的接口进行抽象, 从而使它们更容易使用; 它并不定义新功能, 子系统也不知道Facade的存在. 通常来讲, 仅需要一个Facade对象, 因此Facade对象通常属于Singleton模式。