外观模式 阳光穿透心脏的1/2处 2021-09-20 04:40 283阅读 0赞 [2019独角兽企业重金招聘Python工程师标准>>> ][2019_Python_] ![hot3.png][] **1.定义** [外观模式][Link 1],外观模式([Facade][]),为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用。 通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性。 例子1:医院看病 首先病人必须先挂号,然后门诊。如果医生要求化验,病人必须首先划价,然后缴费,才可以到化验部门做化验。化验后再回到门诊室。 ![SouthEast][] 解决这种不便的方法便是引进门面模式,医院可以设置一个接待员的位置,由接待员负责代为挂号、划价、缴费、取药等。这个接待员就是门面模式的体现,病人只接触接待员,由接待员与各个部门打交道。 ![SouthEast][SouthEast 1] 在软件开发中,有时候为了完成一项较为复杂的功能,一个客户类需要和多个业务类交互,而这些需要交互的业务类经常会作为一个整体出现,由于涉及到的类比较多,导致使用时代码较为复杂,此时,特别需要一个类似服务员一样的角色,由它来负责和多个业务类进行交互,而客户类只需与该类交互。外观模式通过引入一个新的**外观类(Facade)**来实现该功能,外观类充当了软件系统中的“服务员”,它为多个业务类的调用提供了一个统一的入口,简化了类与类之间的交互。在外观模式中,那些需要交互的业务类被称为**子系统(Subsystem)**。如果没有外观类,那么每个客户类需要和多个子系统之间进行复杂的交互,系统的耦合度将很大,如图2(A)所示;而引入外观类之后,客户类只需要直接与外观类交互,客户类与子系统之间原有的复杂引用关系由外观类来实现,从而降低了系统的耦合度,如图所示: ![1354636729\_2852.jpg][1354636729_2852.jpg] 1 为复杂系统 提供简单的接口。 2 客户程序与抽象类的实现部分分离。 3 构建层次系统时,用作入口。 **2.结构** ![SouthEast][SouthEast 2] ![1354636733\_5965.jpg][1354636733_5965.jpg] ** Facade(外观角色):**在客户端可以调用它的方法,在外观角色中可以知道相关的(一个或者多个)子系统的功能和责任;在正常情况下,它将所有从客户端发来的请求委派到相应的子系统去,传递给相应的子系统对象处理。 ** SubSystem(子系统角色):**在软件系统中可以有一个或者多个子系统角色,每一个子系统可以不是一个单独的类,而是一个类的集合,它实现子系统的功能;每一个子系统都可以被客户端直接调用,或者被外观角色调用,它处理由外观类传过来的请求;子系统并不知道外观的存在,对于子系统而言,外观角色仅仅是另外一个客户端而已。 子系统角色SubSystemA class SubSystemA { public void MethodA(){ //业务实现代码 } } 子系统角色SubSystemB class SubSystemB{ public void MethodB(){ //业务实现代码 } } 子系统角色SubSystemC class SubSystemC{ public void MethodC(){ //业务实现代码 } } 外观类 class Facade { private SubSystemA obj1 = new SubSystemA(); private SubSystemB obj2 = new SubSystemB(); private SubSystemC obj3 = new SubSystemC(); public void Method(){ obj1.MethodA(); obj2.MethodB(); obj3.MethodC(); } } client class Client{ static void Main(string[] args){ Facade facade = new Facade(); facade.Method(); } } **3.优缺点** **优点:** 1)对客户屏蔽子系统组件,减少了客户处理的对象数目并使得子系统使用起来更加容易。通过引入外观模式,客户代码将变得很简单,与之关联的对象也很少。 2)实现了子系统与客户之间的松耦合关系,这使得子系统的组件变化不会影响到调用它的客户类,只需要调整外观类即可。 3)降低了大型软件系统中的编译依赖性,并简化了系统在不同平台之间的移植过程,因为编译一个子系统一般不需要编译所有其他的子系统。一个子系统的修改对其他子系统没有任何影响,而且子系统内部变化也不会影响到外观对象。 4)只是提供了一个访问子系统的统一入口,并不影响用户直接使用子系统类。 **缺点** 1) 不能很好地限制客户使用子系统类,如果对客户访问子系统类做太多的限制则减少了可变性和灵活性。 2) 在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。 **4.总结** 1)根据[“单一职责原则”][Link 2],在软件中将一个系统划分为若干个子系统有利于降低整个系统的复杂性,一个常见的设计目标是使子系统间的通信和相互依赖关系达到最小,而达到该目标的途径之一就是引入一个外观对象,它为子系统的访问提供了一个简单而单一的入口。 2)[外观模式][Link 1]也是“迪米特法则”的体现,通过引入一个新的外观类可以降低原有系统的复杂度,外观类充当了客户类与子系统类之间的“第三者”,同时降低客户类与子系统类的耦合度。外观模式就是实现代码重构以便达到“迪米特法则”要求的一个强有力的武器。 3)[外观模式][Link 1]要求一个子系统的外部与其内部的通信通过一个统一的外观对象进行,外观类将客户端与子系统的内部复杂性分隔开,使得客户端只需要与外观对象打交道,而不需要与子系统内部的很多对象打交道。 4)[外观模式][Link 1]从很大程度上提高了客户端使用的便捷性,使得客户端无须关心子系统的工作细节,通过外观角色即可调用相关功能。 5)不要试图通过外观类为子系统增加新行为 ,不要通过继承一个外观类在子系统中加入新的行为,这种做法是错误的。外观模式的用意是为子系统提供一个集中化和简化的沟通渠道,而不是向子系统加入新的行为,新的行为的增加应该通过修改原有子系统类或增加新的子系统类来实现,不能通过外观类来实现。 参考 :[http://blog.csdn.net/jason0539][http_blog.csdn.net_jason0539] 转载于:https://my.oschina.net/u/3701483/blog/1587765 [2019_Python_]: https://my.oschina.net/u/2663968/blog/3061697 [hot3.png]: /images/20210726/360abd4c4691464f97603fe8d217b5d8.png [Link 1]: http://blog.csdn.net/hguisu/article/details/7533759 [Facade]: https://baike.baidu.com/item/Facade/2954918 [SouthEast]: /images/20210726/d67672db261f49ca926e52bcc370b579.png [SouthEast 1]: /images/20210726/2aed0960e48a49608e4e7b9ccd4dd4a0.png [1354636729_2852.jpg]: https://img-my.csdn.net/uploads/201212/04/1354636729_2852.jpg [SouthEast 2]: /images/20210726/15ae266443b446eb99585dcd87cba77e.png [1354636733_5965.jpg]: https://img-my.csdn.net/uploads/201212/04/1354636733_5965.jpg [Link 2]: http://blog.csdn.net/hguisu/article/details/7571617 [http_blog.csdn.net_jason0539]: http://blog.csdn.net/jason0539
相关 外观模式 一、前言 `你感受到的容易,一定有人为你承担不容易` 这句话更像是描述生活的,许许多多的磕磕绊绊总有人为你提供躲雨的屋檐和避风的港湾。其实编程开发的团队中也一样有人只负 Bertha 。/ 2022年10月16日 08:00/ 0 赞/ 21 阅读
相关 外观模式 外观模式:提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。 ![输入图片说明][13102715_KJeI.png] 外观模 曾经终败给现在/ 2022年06月03日 02:42/ 0 赞/ 50 阅读
相关 外观模式 外观模式 外观模式:提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。 要点: 1. 外观模式为复杂子系统提供了一个简单 秒速五厘米/ 2022年05月25日 07:50/ 0 赞/ 260 阅读
相关 外观模式 定义 外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 结构图 ![这里写图片描述][70] 旧城等待,/ 2022年05月14日 11:34/ 0 赞/ 36 阅读
相关 外观模式 外观模式 一、概述 1. 隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统 川长思鸟来/ 2022年04月18日 04:52/ 0 赞/ 87 阅读
相关 外观模式 前言 外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义一个高层的接口,这个接口使得这一子系统更加容易使用。 一、子类 子类系统 分手后的思念是犯贱/ 2021年12月09日 00:45/ 0 赞/ 270 阅读
相关 外观模式 [2019独角兽企业重金招聘Python工程师标准>>> ][2019_Python_] ![hot3.png][] 1.定义 [外观模式][Link 1],外观模式([F 阳光穿透心脏的1/2处/ 2021年09月20日 04:40/ 0 赞/ 284 阅读
相关 外观模式 外观模式:为子系统中的一组接口提供一个一直的界面,此模式定义一个高层接口,这个接口使得这个子系统更加容易使用。 什么时候使用:首先,在设计初期阶段,应该有意识的将不同的两个层 叁歲伎倆/ 2021年09月17日 01:18/ 0 赞/ 150 阅读
相关 外观模式 一 点睛 有些人可能炒过股票,但其实大部分人都不太懂,这种没有足够了解证券知识的情况下做股票是很容易亏钱的,刚开始炒股肯定都会想,如果有个懂行的帮帮手就好,其实基金就是个 绝地灬酷狼/ 2021年07月24日 22:08/ 0 赞/ 395 阅读
相关 外观模式 观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏... 小灰灰/ 2020年06月13日 05:54/ 0 赞/ 697 阅读
还没有评论,来说两句吧...