• python : 设计模式之外观模式(Facade Pattern)


    #为啥要用外观模式举例说明

    这个例子很形象,直接从人家博客上贴过来的,参考链接在下面

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

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

    #定义

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

     #看图理解外观模式

     #涉及角色

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

    #使用场景

    比如经典的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()
    

    参考

    https://www.cnblogs.com/adamjwh/p/9048594.html

    https://www.2cto.com/kf/201803/726607.html

    https://blog.csdn.net/LoveLion/article/details/8258121

    https://blog.csdn.net/ponder008/article/details/6868815

  • 相关阅读:
    生成器
    字典生成式
    列表推导式
    函数基础实战之ATM和购物车系统
    函数基础小结
    函数嵌套
    可变长参数
    函数参数
    java NIO(三)----通道(Channel)
    java NIO(二)----直接缓冲区和非直接缓冲区
  • 原文地址:https://www.cnblogs.com/baxianhua/p/11301186.html
Copyright © 2020-2023  润新知