CSDN博客

img xiaoming_t

facade

发表于2004/10/17 11:33:00  896人阅读

公司里平凡的一天...
(叮铃铃 电话铃响)
客户(对开发人员):你们的那个软件的问题什么时候处理啊,不是说星期二过来吗.....
小孙(对客户):这个问题你要联系一下我们老板...
(客户与老板激情讨论...)
老板(对开发人员):小仲,小孙你们一起把这个问题解决一下...
老板(对客户):我们下个礼拜过来...

这里,老板就是facade,客户无须与开发部打交道,所有事宜联系老板即可(除非……)


定义

名称:Facade

结构:



意图:
为子系统中的一组接口提供一个一致的界面,Facade 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

适用性:
  • 当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类。这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难。Facade 可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过facade 层。
  • 客户程序与抽象类的实现部分之间存在着很大的依赖性。引入facade 将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。
  • 当你需要构建一个层次结构的子系统时,使用facade 模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,你可以让它们仅通过facade进行通讯,从而简化了它们之间的依赖关系。


  • 经典案例

    1、J2EE:  Session Facade(会话外观)
            在J2EE应用环境中,存在着很多实现相关功能的EntityBean,这时候如果你要让用户端应用程序进行每次操作、创建Entity,那么不但实现复杂,而且效率极低,如果使用一个Session作为facade,那么就会解决很多问题。
            参考EJB设计模式概述 http://dev2dev.bea.com.cn/techdoc/other/20031085.html
            J2EE体系结构设计http://www.sawin.com.cn/doc/SD/Architect/j2eemvc.htm


    最佳实践

    1、很多项目在开发的过程中很有可能需要和别的系统打交道。而在这过程中我们又不需要使用到别的系统的全部接口,在这种情况下我们就可以使用Facade模式。把我们需要的用到的一些功能包装起来,做成一些函数,甚至是类,以方便本项目的使用。如果清楚的列举了当前项目中可能需要用到的别的系统中的地方的话,那么只要少数的几个人去理解,并整理出接口,而别的开发人员只需要直接调用这些接口就可以了,节省时间。

    2、使用facade在体系结构上实现分层,提供layer-layer之间一个简洁抽象的接口.


    相关模式
    1、facade vs proxy
            facade模式有些地方翻译成门面模式,是个很形象的名字。
    我这里有很多组件提供很多的服务,而调用的一端就要和这些组件直接打交道,你可以想成一个多对多的关系。而facade模式就是给这些服务的组件提供一个共同的门面,调用的地方要访问这些服务,对不起不要直接找组件,找我,我去帮你搞定,你可以想成一个多对一和一个一对多两个关系。而facade就是中间那个“一”,也就是一个门户。
            Proxy模式就是代理模式,就是对一个对象提供一个代理,控制其他对象对他的访问。
    比如保护代理,就要控制你有没有权限访问被代理的对象,也就是说你要想访问XXX,要先过我这一关。
    当然,proxy也不一定都是用来控制权限,比如可以在被代理对象的方法执行的前后做一些log的事情啊什么的。注意这里proxy和被代理的对象实现的是同一接口。

    2、facade vs adapter
            Adapter用于把两个接口匹配,而Facade则用于包装一组接口。
            如果你拿到一个工具包,你到底是采用何种方法才能复用工具包内的类。
            其实选择很明显,对我而言,Adapter是一种白箱复用,而Facade则是一种黑箱复用。所谓的白箱复用,就是说你在使用Adapter是需要知道Adaptee的接口,然后你从它的接口继承(类Adptee)或者把你自己接口上的操作分派到Adaptee(对象Adaptee).而所谓的黑箱复用,就是说不管该工具箱或者说是框架时你实现还是别人实现,那么你可以直接使用Facade而不是去继承。
            第二个问题是,你现在实现Facade的时候,一般来说,facade内部包括的子系统或者类之间具有较强的耦合,其他人要使用这些类的时候,往往要进行一系列的对象创建过程,同时需要调用许多类的方法才能实现一个功能,这时候,你最好使用facade进行包装,facade的具体应用的一个很好的例子是在J2EE应用环境中,存在着很多实现相关功能的EntityBean,这时候如果你要让用户端应用程序进行每次操作、创建Entity,那么不但实现复杂,而且效率极低,如果使用一个Session作为facade,那么就会解决很多问题。
            Facade的其他重要作用包括在体系结构上实现分层,提供layer-layer之间一个简洁抽象的接口,而Adpater则主要应用于对系统的局部可以插入可变的实现。
            要说的话可能还有很多很多,设计模式的应用要从实际出发,如果你在实际中经常去使用这些东西,对你以前的程序经常去refactor,那么很多东西都是自然而然的。


    参考文章
    1、EJB设计模式概述
           http://dev2dev.bea.com.cn/techdoc/other/20031085.html
    2、J2EE体系结构设计
           http://www.sawin.com.cn/doc/SD/Architect/j2eemvc.htm
    3、Pattern Tips 之一
       (讲解Adapter,Bridge,Facade,Proxy的异同,pattern tips 系列着重讲解GOF设计模式之间的关系)
           http://www.vckbase.com/document/viewdoc/?id=751
    阅读全文
    0 0

    相关文章推荐

    img
    取 消
    img