stand on the shoulders of giants

【设计模式】之 Facade 模式

结构

二者对比可以看出差别么?
举例来看:一个坦克系统,子系统是履带系统,发动机系统,火炮系统,防卫装甲系统等。对外的接口就是暴露给使用人员的是Run(), shot(), stop()等。
如果没有采用Facade模式,开动坦克需要直接依赖履带系统,发动机系统。直接去操作履带,操作发动机?
各个接口和子系统都产生了紧耦合。

问题产生了:组件的客户(接口)和组件内各个复杂子系统有过多的耦合,随着外部客户程序和各个子系统的变化,这种耦合面临着变化的挑战。
如何简化外部客户程序和系统间的交互接口,如何将外部程序的演化和内部子系统的变化解耦?
使该简单的简单!不管内部实现怎么变化,我们只要Run(), shot(), stop()!

意图

为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。[GOF 《设计模式》]

生活中的例子(TerryLee)

外观模式为子系统中的接口定义了一个统一的更高层次的界面,以便于使用。当消费者电话订购时,则体现了一个外观模式。消费者拨打一个号码与客服代表联系,客服代表则扮演了这个"外观",他包含了与订货部、收银部和送货部的接口。

代码示例(dofactory)

贷款抵押应用程序组件(a large subsystem of classes measuring the creditworthyness of an applicant)
如何provides a simplified interface给这个组件?

mortgage.IsEligible

类图:


题外话---
次级债、金融危机就是这样产生的,唉。
设计模式一方面简化了我们的工作,一方面把内部的细节隐藏起来。
这个门面类一定是投机者写出来的;银行员工拿来mortgage.IsEligible(...)   无语...
关于这个例子,TerryLee在这里给了更详尽的演化过程。

适用性

1. 为一个复杂子系统提供一个简单接口;
2. 提高子系统的独立性;
3. 在层次化结构中,可以使用Facade模式定义系统中每一层的入口。

总结

Facade设计模式更注重从架构的层次去看整个系统,而不是单个类的层次。Facade很多时候更是一种架构设计模式。
Facade更注重简化接口,Adapter模式注重转换接口,Bridge模式注重分离接口(抽象)与其实现,Decorator模式注重稳定接口的前提下为对象扩展功能。

posted @ 2008-11-19 14:57  DylanWind  阅读(8574)  评论(4编辑  收藏  举报