前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python设计模式(8):外观模式

Python设计模式(8):外观模式

作者头像
不可言诉的深渊
发布2019-07-26 17:48:33
4340
发布2019-07-26 17:48:33
举报

现实生活中的外观

外观一词来自于英文词语 Facade,这个词用来表示一个建筑物的外观,而隐藏了其内部的细节。外观模式(Facade Pattern)用来隐藏一个软件系统的所有内部细节,只提供给客户(Client)类一个外观类,或者叫做接口类。客户类直接调用该外观类的方法即可,而不必关心这些方法对其他类的调用的内部细节。

在 Java 语言中,JDBC 是一个众所周知的典型的外观类,它为用户(程序员)提供了所有关于数据库连接和访问的功能。用户只要调用这些功能即可,而不必关心 JDBC 是怎样实现这些功能的。

外观模式的概念

这样的基本思想也可以被普遍应用到软件设计中。例如,在类库中有多个类 Class1,Class2,……,Class12 等。客户类 Client 要调用这些类中的方法。Client 类的程序员必须要读懂类中所有函数的描述,包括参数类型、返回值、类的内部所包含的复杂的数据结构等,才能决定使用合适的方法。但是这种做法在类库中的类比较复杂和人员自身经验不足的情况下往往不太现实。此时,可以编写一个外观类 Facade,将项目所需要的功能都封装在这个类中,这样,程序员只需要调用这个门面类提供的方法即可完成编程任务。

如图所示的设计类图即为外观模式设计类图。“四人帮”(Gang of Four,GOF)在《设计模式》一书中对外观模式的描述为:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这个子系统更加容易使用。

外观模式有三个角色组成。

  1. 外观角色(Facade):这是外观模式的核心,它被客户角色调用,因此它熟悉子系统的功能。其内部根据客户角色已有的需求预定了几种功能组合。
  2. 子系统角色:实现子系统的功能,对它而言,外观角色和客户角色一样是未知的,它没有任何外观角色的信息和链接。
  3. 客户角色:调用外观角色来完成要得到的功能。
代码语言:javascript
复制
class Class1:
    def __init__(self):
        print('Class1')


class Class2:
    def __init__(self):
        print('Class2')


class Class3:
    def __init__(self):
        print('Class3')


class Class4:
    def __init__(self):
        print('Class4')


class Class5:
    def __init__(self):
        print('Class5')


class Class6:
    def __init__(self):
        print('Class6')


class Class7:
    def __init__(self):
        print('Class7')


class Class8:
    def __init__(self):
        print('Class8')


class Class9:
    def __init__(self):
        print('Class9')


class Class10:
    def __init__(self):
        print('Class10')


class Class11:
    def __init__(self):
        print('Class11')


class Class12:
    def __init__(self):
        print('Class12')


class Facade:
    @staticmethod
    def call(c):
        eval(f'Class{c}()')


class Client:
    @staticmethod
    def main():
        facade = Facade()
        facade.call(input())


if __name__ == '__main__':
    Client.main()

关于外观模式的讨论

使用外观模式的目的

为一系列复杂的接口提供一个统一的接口,使该系统更容易使用。这个统一的接口可以被认为是更高级的接口,提供足够的功能,供客户程序直接调用,而复杂的对于类库的调用则被隐藏在该接口中,实际上由该接口负责调用。

外观模式的优缺点

外观模式的优点为,利用外观模式可以去掉子系统与客户程序间的直接绑定,从而提高子系统的独立性,也降低了客户程序与子系统的直接耦合度。此外,利用外观模式可以使系统层次化。

外观模式的缺点为,对于那些不需要定制的用户来说,例如一个熟练的程序员要写一些复杂的功能,而外观类中没有这样的功能,因此外观模式可能对他们没有帮助。在这种情况下,用户程序可以直接绕过外观模式,而直接调用子系统类库。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python机器学习算法说书人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档