- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
L13B门面(Facade)模式
门面(Facade)模式 门面模式是对象的结构模式。外部与一个子系统的通信必需通过一个统一的门面(facade)对象进行,这就是门面模式。 引言 子系统的客户端 现代的软件系统都是比较复杂的,设计模式的任务就是协助设计师处理复杂系统的设计。 设计师处理复杂系统的一个常见方法便是将其“分而治之”,把一个系统划分为几个较小的子系统。但是这样做了以后,设计师往往仍然会发现一个子系统 内仍然有太多的类要处理。而使用一个子系统的客户端往往需要同时与子系统内部的许多对象打交道后才能达到目的。 医院的例子 用一个例子进行说明,如果把中国大陆的医院作为一个子系统,按照部门职能,这个系统可以划分为挂号、门诊、划价、化验、收费、取药等。看病的病人要与这些部门打交道,就如同一个子系统的客户端与一子系统的各个类打交道一样,不是一件容易的事情。 首先病人必须挂号,然后门诊。如果医生要求化验,病人必须先 划价,然后缴款,才能到化验部门做化验。化验后,再回到门诊室 上图描述的是病人在医院里的体验,图中的方框代表医院。 解决这种不便的方法就是引进门面模式。仍然通过医院的例子说明,可以设置一个接待员的位置,由接待员负责代为挂号、划价、缴费、取药等。这个接待员就是门面模式的体现,病人只接触接待员,由接待员负责与医院的各个部门打交道,如下页图所示。 什么是门面模式 门面模式要求一个子系统的外部与其内部的通信必须通过一个统一的门面(Facade)对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。 使用了门面模式之后,本章的第一个图中所描述的一个子系统的客户端对象所面对的复杂关系就可以得到简化,如下页图所示: 如同医院的接待员一样,门面模式的门面类将客户端与子系统的内部复杂性分隔开,使得客户端只需要与门面对象打交道,而不需要与子系统内部的很多对象打交道。 门面模式是对象的结构模式。门面模式[GOF95]没有一个一般化的类图描述,最好的描述方法实际上就是以一个例子说明。如下图所示: 在这个图中,出现了两个角色 门面(Facade)角色:客户端可以调用这个角色的方法。此角色知晓相关的子系统的功能和责任。 子系统(Subsystem)角色:可以同时有一个或者多个子系统。每一个子系统都不是一个单独的类,而是一个类的集合。每一个子系统都可以被客户端直接调用,或者被门面角色调用。子系统并不知道门面的存在,对于子系统而言,门面仅仅是另外一个客户端而已 一个系统可以有几个门面类 [GOF]的书中指出:在门面模式中,通常只需要一个门面类,并且此门面类只有一个实例。当然这并不意味着在整个系统里只能有一个门面类,而仅仅是说对每一个子系统只有一个门面类。或者说,如果一个系统有好几个子系统的话,每个子系统有一个门面类,整个系统可以有数个门面类。 以医院为例,可以为每一个不同的科室配备不同的接待员类。 为子系统增加新行为 初学者往往以为通过继承一个门面类就可以在子系统中加入新的行为,这是错误的。门面模式的用意是为子系统提供一个集中化和简化的沟通管道,而不能向子系统加入新的行为。仍以医院为例,接待员并不是医护人员,不提供医疗服务。 如果一个门面模式不能将子系统所有的行为提供给外界,那么可以通过修改门面类或者继承门面类的办法,使门面类或其子类能够将子系统的行为提供给外界。 在什么情况下使用门面模式 为一个复杂子系统提供一个简单接口 子系统往往因为不断演化而变得越来越复杂,使用门面模式可以使得子系统更具有可复用性。Fa?ade模式可以提供一个简单的默认视图,对大多数用户来说这个视图已经足够用了,而那些需要进一步继承的用户可以越过Fa?ade层直接对子系统进行继承。 子系统的独立性 一般而言,子系统和其他的子系统之间、客户端与实现层之间存在着很大的依赖性。引入Facade模式将一个子系统与它的客户端以及其他的子系统分离,可以提高子系统的独立性和可移植性。 层次化结构 在构建一个层次化的系统时,可以使用Fa?ade模式定义系统中每一层的入口。如果层与层之间是相互依赖的,则可以限定它们仅通过Facade进行通信,从而简化了层与层之间的依赖关系。 迪米特法则(LoD) 迪米特法则说:“只与你直接的朋友们通信”。迪米特法要求每一个对象与其他对象的相互作用均是短程的,而不是长程的。只要有可能,朋友的数目越少越好。即一个对象只应当知道它
文档评论(0)