门面模式(Facade Design Pattern),又称为外观模式,通过对外提供一组统一的接口,让接口更易用。
门面模式的原理和实现都不复杂,应用场景也比较明确,主要就是用在接口设计方面。
平常我们开发,为了保证接口单一原则,以及接口的复用性和隔离性,我们的接口都会做的粒度比较细,一个接口只做一件事。这样对于解耦、复用是很好的。但是当粒度过小时,有些外部系统想要开发一个功能时,需要调用大量的接口才能得到完整的数据或信息,这样的体验是非常不好的。
但是一个接口设计的过大,什么信息都包含其中,要做很多事情,会导致接口通用性和复用性差。
针对这种接口的复用性以及易用性的矛盾,门面模式就是一个比较好的解决方式。
优缺点
优点
- 简化调用,封装了繁琐的细节。
- 减少系统间依赖,遵循最小依赖原则。
- 接口对外透明,不需要调用者关心。
缺点
- 违背了单一原则。
- 减少了接口的灵活性和复用性,接口内部更加复杂。
应用场景
-
很多监控系统提供的统一监控信息,就是各种细粒度的监控聚合后提供的统一接口。
-
模块之间对外暴露的依赖调用,一般都会做一层封装,把内部的数据聚合封装后再对外提供。
-
在各种分层模型中,层与层之间通过接口交互,一般这些接口都属于包装过的门面模式。
门面模式的构成
门面模式的构成非常简单,也很好理解,主要就是两部分:
- 多个细粒度的接口(原始接口)。
- 细粒度接口组合成的更大的接口(门面接口)。
我们用一个展示计算机信息的接口为例。
计算中有 CPU / 内存 / 磁盘 等信息,每个信息都有自己的接口。
但是我们一般使用时,都是关注整个计算机整体的信息情况,没必要一个个单独去看。
这时候提供一个统一的接口查看整个计算机的基本信息就非常好了。
原始接口
我们定义3个细粒度的接口,分别用来展示 CPU / 内存 / 磁盘 的信息。
class Cpu:
def info(self):
print("i7-8700,8核")
class Memory:
def info(self):
print("16GB内存")
class Disk:
def info(self):
print("512GB")
门面接口
定义一个展示整体计算机信息的接口类,将细粒度接口都封装了起来,更加易用。
class ComputerInfo:
def __init__(self):
self.cpu = Cpu()
self.mem = Memory()
self.disk = Disk()
def show(self):
self.cpu.info()
self.mem.info()
self.disk.info()
具体使用
# 单独使用,需要调用3个接口,麻烦
Cpu().info()
Memory().info()
Disk().info()
# 通过门面模式封装成一个,只需要调用一个
ComputerInfo().show()
总结
门面模式是专门做接口整合的,解决的是多接口调用带来的问题,提高接口的易用性。