`
fengzl
  • 浏览: 215557 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

FACADE模式

阅读更多

我将通过对外观模式 (Facade Pattern) 的讲解来开始我们对设计模式的学习。也许在过去你就已经使用到了外观设计模式只是你并未曾注意到。 <o:p> </o:p>

在这一章里将包含以下的一些内容: <o:p> </o:p>

l          什么是外观设计模式 (Facade Pattern) 及其用途 <o:p> </o:p>

l          指出 Facade 模式的主要功能 <o:p> </o:p>

l          提出 Facade 模式的一些变化 <o:p> </o:p>

Facade 模式的基本介绍 <o:p> </o:p>

GoF 的《设计模式》一书中提到,使用 Facade 模式的目的是:给子系统的系列接口提供一个统一的外部接口。使用 Facade 模式就是定义一个 Facade 接口,她是一个可以使原来的子系统更加容易被我们使用的高级接口。 <o:p> </o:p>

也就是说,我们需要和一个比当前系统所提供的方法要更加难的系统进行交互,或者说我们需要用某种特定的方式来使用当前系统 ( 比如把一个 3D 的绘图程序作为 2D 的绘图程序来使用 ) 。我们可以建立这样的方法因为我们只需要使用到当前系统的一部分功能。 <o:p> </o:p>

正式学习 Facade 模式 <o:p> </o:p>

曾经,我在一个大型的工程制造工厂里负责工程承包的工作。在我工作的第一天,这个项目的技术带头人不在。但是,我不可能白拿薪水,客户想给我找点事情干,尽管这些事情毫无意义。难道,你没有遇见过这样的情况吗? <o:p> </o:p>

因此,该项目组的一个人还真给我找了点事做。她说:“你将会学习到我们会使用到的 CAD/CAM 系统,也许现在你就可以开始学习了。就从这些手册开始吧!”然后,她把我带到一大堆的文档前。不是我夸张,有 8 英尺这么长的手册摆在书架上等着我去阅读,而且这些手册都是 8.5 × 11 英寸大小,还是小号字印刷的!这真是一个复杂的系统。 <o:p> </o:p>

那么,我,或者说我和你,或者更多人,假如我们将会在一个项目中用到刚才的这个 CAD/CAM 系统,我们该怎么办?是我们每个人都学习到底如何使用这个系统吗?还是说我们先把我们要用到功能提出来,然后由一个人来编写某些特定的接口来使用这个系统,而剩下的人只需要知道如何使用这些特定的接口就可以了呢? <o:p> </o:p>

这个编写接口的人将决定我和我们项目组的其他人将如何使用这个系统,将决定我们用什么样的 API 来完美的完成工作。她将会根据我们的需要创建一个或者多个的类 (Facade class) 。我和其他同事就只使用她创建的这些类而不用去学习这整个复杂的系统了。 <o:p> </o:p>

这种方式只适合在我们只用到这个系统的一部分功能或者只用某种特定方式来使用这个系统的时候。如果系统中的所有功能都要被用到,那么更好的设计方案将会是考虑当前系统是否是最值得我们使用的。 <o:p> </o:p>

这就是外观设计模式 (Facade Pattern) 。她让我们可以更方便地使用那些相当复杂的系统。虽然我们有一个非常复杂的系统,但是,我们仅仅需要其中的一部分功能,或者我们以某个特定方式来使用这些功能。怎样,通过 Facade 模式的使用,我们将会得到一个非常易用或者更满足我们需要的系统。 <o:p> </o:p>

大多数工作仍然将会被底层的原始系统来完成。前面讲到的我们自己编写的 Facade class 将提供一些很容易理解的方法供我们使用。这些方法使用底层的原始的系统来完成我们新定义的功能。 <o:p> </o:p>

<o:p> </o:p>

Facade 模式不仅仅可以用来创建更简单的方法调用,还可以用来减少客户对象需要操纵的对象的个数。例如:假设我有一个 Client 类的对象,它必须打开一个 Database ,并从中取得一个 Model 。然后通过 Model 查询得到一个 Element 。最后, Client 还要从 Element 里面得到自己需要的信息。这肯定是一个很复杂的过程。如果,我们建立一个 DatabaseFacade 的中间类, Client 通过它来完成上述的一系列工作,这一切将变得简单的多。请看下面的 UML 图。

<o:p> </o:p>

<o:p> </o:p>

如果我们的 Facade class 是无状态的类 ( 也就是说它里面不保存任何和状态有关的量 ) ,一个 Facade 的对象可以同时被多个其他的对象使用。随后,在 21 章,我们将学习如何通过使用 Singleton 模式和 Double-Checked Locking 模式来实现这个功能。 <o:p> </o:p>

<o:p> </o:p>

设想,除了使用当前系统内的功能以外,我们还提供一些新的功能-比如,把所有程序调用过程记录到一个事务里面。这样,我们所使用的功能超出了当前系统的功能。 <o:p> </o:p>

这种情况下,我们可以通过向 Facade 类里添加其他的一些方法 (method) 来扩展其功能。这仍然是 Facade 模式,只是她原有的功能得到扩展。我们的主要目标是简化方法的调用因为我们并不希望客户端程序知道调用哪些额外的方法-这一切都通过 Facade 来完成了。 <o:p> </o:p>

Facade 模式给我们一个普遍的使用方法。在本模式中的 Facade 类的实质就是我们为客户端创建新的接口,而不是去继续使用原有的接口。我们可以这样做,是因为我们不需要使用原始系统中的所有方法。 <o:p> </o:p>

Facade 模式还可以用来隐藏或封装原来的系统。 Facade 类可以把原来的系统当成私有变量。这样,原始系统就仅仅和 Facade 类有联系而不会暴露给 Facade 类的使用者。 <o:p> </o:p>

正如下面将要提到的,我们有很多理由来封装系统: <o:p> </o:p>

l          追踪系统使用 -通过限制所有对系统功能的调用必须由 Facade 类来完成,我们可以非常方便地监视系统使用状况。 <o:p> </o:p>

l          在系统间进行切换 -有可能在将来我们所使用的系统会有所改变。通过把原始系统当成 Facade 类的私有成员变量 (private member) 来处理,我们可以很轻易的切换我们所使用的系统。当然,也许仍然有巨大的工作量,但是至少,我只需要改变一个地方 (Facade ) <o:p> </o:p>

总结 <o:p> </o:p>

外观模式 (Facade Pattern) 名称的得来是因为她在原始系统的前面建立了一个新的接口 (Facade ) <o:p> </o:p>

我们将在以下的情况中使用到 Facade 模式: <o:p> </o:p>

l          当不需要使用一个复杂系统的所有功能时。创建一个类来包含所有使用这个系统的规则、方法。通常,我们会用到一个原始系统的子系统,新创建的类的接口 (API) 将会比原始系统的接口 (API) 简单得多。 <o:p> </o:p>

l          当想要封装或隐藏原始系统时。 <o:p> </o:p>

l          当想要使用原始系统的某些功能并添加新功能时。 <o:p> </o:p>

l          当编写新类的花费要低于项目组每个人都学习如何使用原始系统或者低于在后期维护时的投入的时候。
分享到:
评论
5 楼 xin_ny 2011-06-25  
这本书我正在看,第二版的《设计模式解析》
4 楼 wudiju 2010-05-07  
如果加上自己的理解就好了。。。
3 楼 gongmingwind 2010-01-18  
好文章,讲解的入目三分
2 楼 yz_beijing 2009-11-10  
好文章,不过应该注明:出自设计模式精解
1 楼 yz_beijing 2009-11-10  
好文章,不过应该注明:出自&gt;

相关推荐

    设计模式1,FACADE模式,Adapter

    本文将深入探讨FACADE模式、Adapter模式以及Singleton和Proxy模式的基本概念、应用场景和关键要素。 首先,FACADE(外观)模式是一种接口型模式,它的主要作用是为复杂的子系统提供一个简单的接口,使得客户端无需...

    C++ Facade模式

    **C++ Facade模式** Facade模式,又称为外观模式,是设计模式中的一种结构型模式。在软件工程中,它为子系统提供了一个统一的入口,简化了客户端对复杂子系统的访问,使得客户端无需了解子系统内部的具体实现细节。...

    java实现的简单的应用facade模式范例

    **Java实现的简单应用:Facade模式范例** Facade模式,也称为门面模式,是一种结构型设计模式,它提供了一个统一的接口,用于与复杂的子系统进行交互。这个模式简化了客户端与子系统之间的交互,使得客户端只需要...

    Facade模式

    **Facade模式** Facade模式是一种设计模式,它提供了一个统一的接口,用来访问子系统中的一组接口。这个统一的接口使得客户端不必了解子系统组件的内部细节,简化了客户端与复杂系统之间的交互。在软件工程中,当一...

    设计模式之门面模式(Facade模式)

    设计模式之门面模式(Facade模式),介绍门面模式,实际例子分析,代码讲解等

    使用反射技术和Facade模式演示封装数据库操作--ORM原理

    于是,使用Facade模式和反射技术模拟Hibernate框架技术演示怎样书封装数据库的操作。 环境:Windows XP Professional, JDK 1.6, Eclipse 3.3 Europa, SQL Server 2000 使用步骤: 1. 下载解压之后,使用Eclipse导入...

    Facade模式练习

    在`Facade模式练习`中,我们通常会创建一个高层接口,这个接口封装了一系列复杂的操作。这样做可以使客户端代码更加简洁,避免直接与复杂的子系统交互。`Facade`类通常会包含多个对子系统对象的引用,通过调用这些...

    Java设计模式之外观模式(Facade模式)介绍

    外观模式(Facade模式)是一种设计模式,主要用于简化子系统或组件之间的交互,为复杂的系统提供一个简单的接口。在Java中,这种模式可以帮助我们管理和组织大量的类和接口,使其对外呈现简洁的交互方式。 外观模式...

    facade模式

    外观模式属于结构型模式,其意图是为子系统中的一组接口提供一个一致的界面,Façade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。在项目设计中,把一个系统划分成为若干个子系统由利于降低系统的...

    Facade模式_Java源代码

    实验内容: 1) 家庭影院中有CD机,DVD机,收音机Turner,录影机Recorder,功放Amplifier,升降屏幕Screen等,请为家庭影院系统设计一个请设计一个门面,通过它可以方便的操作其他设备放电影等。...

    迪米特法则---门面Facade模式.docx

    门面(Facade)模式是一种设计模式,遵循迪米特法则,旨在简化子系统的使用,减少客户端与子系统之间的复杂依赖关系。迪米特法则主张一个对象应该尽量减少与其他对象的交互,只与直接的朋友交流,以此提高系统的内聚...

    Ajax中使用Facade外观模式的Eclipse版本的Demo

    **Ajax与Facade模式** 在Web开发中,Ajax(Asynchronous JavaScript and XML)技术允许我们创建交互性更强、响应更快的网页。它通过在后台与服务器进行少量数据交换,实现了页面的部分更新,而无需刷新整个页面。...

    java 设计模式 Facade外观模式 Simple Factory 简单工厂模式

    在Java中,当你有一个复杂的子系统,而你希望客户端代码能够以一种更简洁、更易于理解的方式来与之交互时,就可以使用Facade模式。这个模式通过创建一个新类(外观类),将子系统中的一系列接口聚合到一起,客户端只...

    C#面向对象设计模式纵横谈\11 结构型模式Facade外观模式.zip

    在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要... 这是第11节:结构型模式Facade外观模式

    C#面向对象设计模式纵横谈(11):Facade 外观模式(结构型模式)

    - **意图**:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,使得这一子系统更加容易使用。 - **动机**:简化外部客户程序与系统间的交互接口,解耦外部客户程序的演化和内部子系统的变化...

    设计模式之Facade

    Facade模式将子系统的多个组件组合在一起,提供了一个高层次的接口,这个接口只暴露了必要的功能,隐藏了子系统的实现细节。 在软件工程中,随着项目的发展,系统可能会变得越来越复杂,包含很多相互依赖的子系统。...

    Python笔记之facade模式

    门面(Facade)模式是一种结构型设计模式,它在复杂系统中扮演着简化接口的角色,为客户提供一个统一的入口,使得客户不必关心系统的内部结构,从而降低系统的使用难度。在Python中,我们可以很容易地实现这一模式。...

Global site tag (gtag.js) - Google Analytics