现实生活中的外观
外观一词来自于英文词语 Facade,这个词用来表示一个建筑物的外观,而隐藏了其内部的细节。外观模式(Facade Pattern)用来隐藏一个软件系统的所有内部细节,只提供给客户(Client)类一个外观类,或者叫做接口类。客户类直接调用该外观类的方法即可,而不必关心这些方法对其他类的调用的内部细节。
在 Java 语言中,JDBC 是一个众所周知的典型的外观类,它为用户(程序员)提供了所有关于数据库连接和访问的功能。用户只要调用这些功能即可,而不必关心 JDBC 是怎样实现这些功能的。
外观模式的概念
这样的基本思想也可以被普遍应用到软件设计中。例如,在类库中有多个类 Class1,Class2,……,Class12 等。客户类 Client 要调用这些类中的方法。Client 类的程序员必须要读懂类中所有函数的描述,包括参数类型、返回值、类的内部所包含的复杂的数据结构等,才能决定使用合适的方法。但是这种做法在类库中的类比较复杂和人员自身经验不足的情况下往往不太现实。此时,可以编写一个外观类 Facade,将项目所需要的功能都封装在这个类中,这样,程序员只需要调用这个门面类提供的方法即可完成编程任务。
如图所示的设计类图即为外观模式设计类图。“四人帮”(Gang of Four,GOF)在《设计模式》一书中对外观模式的描述为:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这个子系统更加容易使用。
外观模式有三个角色组成。
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()
关于外观模式的讨论
使用外观模式的目的
为一系列复杂的接口提供一个统一的接口,使该系统更容易使用。这个统一的接口可以被认为是更高级的接口,提供足够的功能,供客户程序直接调用,而复杂的对于类库的调用则被隐藏在该接口中,实际上由该接口负责调用。
外观模式的优缺点
外观模式的优点为,利用外观模式可以去掉子系统与客户程序间的直接绑定,从而提高子系统的独立性,也降低了客户程序与子系统的直接耦合度。此外,利用外观模式可以使系统层次化。
外观模式的缺点为,对于那些不需要定制的用户来说,例如一个熟练的程序员要写一些复杂的功能,而外观类中没有这样的功能,因此外观模式可能对他们没有帮助。在这种情况下,用户程序可以直接绕过外观模式,而直接调用子系统类库。
本文分享自 Python机器学习算法说书人 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!