结构型-外观模式(Facade Pattern)

引入

不知道大家有没有比较过自己泡茶和去茶馆喝茶的区别,如果是自己泡茶需要自行准备茶叶,茶具和开水。而去茶馆喝茶,最简单的方式就是跟茶馆服务员说想要一杯什么样的茶,是铁观音,碧螺春还是西湖龙井等。正是因为茶馆有服务员,顾客无需直接和茶叶,茶具,开水等交互。整个泡茶过程有服务器来完成,顾客只需和服务员交互即可,整个过程非常简单省事。


1303036-20190805162904493-1848571136.png

在软件开发过程中,有时候为了完成一项较为复杂的功能,一个客户需要和多个业务类交互,而这些需要交互的业务类经常会作为一个整体出现,由于涉及到的类比较多,导致使用时代码较为复杂,此时,特别需要一个类似服务员一样的角色,由它来负责和多个业务类进行交互,而客户类只需与该类交互。外观模式通过引入一个新的外观类(Facade)来实现该功能,外观类充当了软件系统中的“服务员”,它为了多个业务了的调用提供了一个统一的入口,简化了类与类之间的交互。在外观模式中,那些需要交互的业务类被称为子系统(SubSystem)。如果没有外观类,那么每个客户端类需要和多个子系统之间进行复杂的交互,系统的耦合度将很大;而引入外观类之后,客户类只需要直接与外观类交互,客户类与子系统之间原有的复制引用关系有外观类来实现,从而降低了系统的耦合度。

定义

外观模式为系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得子系统更加容易使用


1303036-20190805142604766-1309616266.png

涉及角色

  1. 门面角色:外观模式的核心。它被客户角色调用,它熟悉子系统的功能。内部根据客户端角色的需求预定了几种功能的组合。
  2. 子系统角色:实现了子系统功能。它对客户角色和Facade 是未知的。它内部可以用系统内的相互交互,也可以由供外界调用的接口。
  3. 客户角色:通过调用 Facade 来完成要实现的功能。

使用场景

比如经典的 MVC 三层架构

优点

  1. 减少系统相互依赖,降低耦合,为复杂的模块或子系统提供外界访问的模块。
  2. 提供灵活性,子系统相对独立。
  3. 提供安全性,预防低水平人员带来的风险。

示例代码

class SubSystemA:
    def methodA(self):
        pass

class SubSystemB:
    def methodB(self):
        pass

class SubSystemC:
    def methodC(self):
        pass

class Facade:
    objA = None
    objB = None
    objC = None

    def __init__(self):
        self.objA = SubSystemA()
        self.objB = SubSystemB()
        self.objC = SubSystemC()

    def method(self):
        self.objA.methodA()
        self.objB.methodB()
        self.objC.methodC()

def clientUI():
    facade = Facade()
    facade.method()

if __name__ == "__main__":
    clientUI()
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容