facade

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

这里,老板就是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
    原创粉丝点击
    热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 寄东西被海关扣留怎么办 天津港新舱单品名错误核销怎么办 移动手机不能用联通卡怎么办 移动手机联通卡网速卡怎么办 移动手机不支持联通4g怎么办 汽车分离轴承异响怎么办 至尊宝被冻结了怎么办 qq冻结了至尊宝怎么办 至尊宝没办法申诉怎么办 至尊宝qq被冻结怎么办 未满16岁怎么办手机卡 联想预装的office卸载怎么办 win10激活后无法启动怎么办 移动电话卡没用了没注销怎么办 快捷快递客服热线一直打不通怎么办 牛奶乳加钙咀嚼片吃多了怎么办 三生骗了我该怎么办 国珍产品新时代卡怎么办 三个月大的宝宝对眼怎么办 9月大婴儿眼睛对眼怎么办 30岁眼部有皱纹怎么办 才24岁眼部皱纹怎么办 被双开后以前的养老保险怎么办 尚赫辟谷期间来月经怎么办 保险公司给代理人奖金迟发怎么办 比亚迪f3烧机油怎么办 支付宝刷脸认证老失败怎么办 融e借没密码器怎么办 融e购不显示积分怎么办 王者荣耀区满了怎么办 苹果4s储存不够怎么办 乐视2费电超级快怎么办 支付宝手机订单号查不到怎么办 淘宝几个订单同一个快递单号怎么办 工商银行u盾丢了怎么办 银行不让开u盾怎么办 手机u盾识别不了怎么办 绿森商城不退款怎么办 电信手机号码过户积分清零怎么办 被电话诈骗骗了怎么办 诈骗电话骗了钱怎么办