Scott's Blog

学则不固, 知则不惑

0%

Python 设计模式-适配器与外观模式

适配器模式让你可以兼容现有代码,外观模式则是为了封装代码而设计。

这是设计模式系列文章的一部分,点击查看该系列的其他文章。

适配器模式

适配器模式,顾名思义就好像是电脑的转接头一样,目的就是让不同的系统之间可以协同工作。

比如现在已经存在一些代码了,但你不想对它做任何更改,因为这意味着你要修改大量的内容,这时候你可以写一个适配器,将输入转化成现有代码可以直接使用的,这就叫适配器。

举个例子,假设我们有一个奇怪的日期格式,它的年和月中间有一个14,现在有一个代码的逻辑是得到初始日期和结束日期中间的天数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import datetime

class DaysCalculator:
def __init__(self, start, end):
self.start = start
self.end = end

def get_days(self):
start = datetime.datetime.strptime(self.start, '%Y14%m')
end = datetime.datetime.strptime(self.end, '%Y14%m')
return (end - start).days

DaysCalculator(start='20211403', end='20211409').get_days()
# 输出 184

现在你有一些方法需要依赖这段代码,你不得不也按照这个奇怪的格式工作,那么这时候你可以写一个适配器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class DaysAdaptor:
def __init__(self, start, end):
start = datetime.datetime.strftime(start, '%Y14%m')
end = datetime.datetime.strftime(end, '%Y14%m')
self.calculator = DaysCalculator(start, end)

def get_days(self):
return self.calculator.get_days()

# 构造两个标准日期对象作为输入
start = datetime.datetime.strptime('2021/3', '%Y/%m')
end = datetime.datetime.strptime('2021/9', '%Y/%m')

# 这里传入的日期类的日期,但也可以正常工作
DaysAdaptor(start, end).get_days()

外观模式

外观模式更关注外部的体验,为了用户体验的方便,它将复杂的内部代码封装起来,只暴露一个简单的方法接受参数供用户调用,从而实现不同的功能。

一个例子是,你想编写一个接受/发送邮件的客户端,对于用户而言,它只需关心:

  • 发件人地址
  • 邮件内容
  • 接受人地址

所以我们可以编写一个简单的方法,只关心这几个参数,而其余的对于地址的处理、检查,对于用户密码的验证等等则隐藏在函数内部。

相信你已经在自己的代码中使用过外观模式,此处不在举例。