一、摘要
外观模式(Facade)是一个使用频率非常高的设计模式之一。
它通过为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用。
二、外观模式概述
现在越来越多的人喜欢到外面的餐馆吃饭,不知道大家有没有留意在家里自己做饭和去外面吃有什么区别?
如果是自己做饭就要买菜、洗菜、做菜、吃菜。而在餐馆吃饭只需要对服务员说,我要什么什么菜。正是因为餐馆有了服务员,它可以为我们提供接口,不用我们亲自去接触菜、不用动手做菜。
服务员就相当是我们的外观模式,避免了我们与那些环节直接接触,让整个过程变得简单。
图一 外观模式买菜吃菜
在系统设计中,某一个系统可能非常庞大,用户要使用该系统就不得不掌握大量的接口,造成使用的不便。这时我们就需要一个类似餐馆服务员的类,用它来给系统进行交流,我们只需要和这个类进行交流就可以了。这个类就是我们所说的外观模式(Facade)
这时可以考虑将该系统细分成一系列子系统并使子系统间的耦合降到最低,利用外观模式提供一个外观对象,为这一系列子系统提供一个简单的使用接口,这样用户只需要掌握外观对象上的少量接口即可使用该系统。
图二 外观模式结构图
三、定义
外观模式:为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
Facade Pattern: Provide a unified interface to a set of interfaces in a subsystem. Facade defines a higher-level interface that makes the subsystem easier to use.
四、结构
外观模式的主要目的在于降低系统的复杂程度。
在面向对象软件系统中,类与类之间的关系越多,不能表示系统设计得越好,反而表示系统中类之间的耦合度太大,这样的系统在维护和修改时都缺乏灵活性,因为一个类的改动会导致多个类发生变化,而外观模式的引入在很大程度上降低了类与类之间的耦合关系。
引入外观模式之后,增加新的子系统或者移除子系统都非常方便,客户类无须进行修改(或者极少的修改),只需要在外观类中增加或移除对子系统的引用即可。从这一点来说,外观模式在一定程度上并不符合开闭原则,增加新的子系统需要对原有系统进行一定的修改,虽然这个修改工作量不大。
图三 外观模式结构图
Facade:这个外观类为子系统提供一个共同的对外接口
Clients:客户对象通过一个外观接口读写子系统中各接口的数据资源。
五、使用场景
在以下情况下可以考虑使用外观模式:
(1)设计初期阶段,应该有意识的将不同层分离,层与层之间建立外观模式。(2) 开发阶段,子系统越来越复杂,增加外观模式提供一个简单的调用接口。
(3) 维护一个大型遗留系统的时候,可能这个系统已经非常难以维护和扩展,但又包含非常重要的功能,为其开发一个外观类,以便新系统与其交互。
【作者:王雷 http://blog.csdn.net/kisscatforever】
未完待续…..