目录
一、适配器模式
适配器模式的组成部分
适配器模式的种类
应用场景
实现步骤
二、测试例子
一、适配器模式
适配器模式(Adapter Pattern)是一种结构型设计模式,它通过将一个现有接口转换为另一个期望的接口来让不兼容的接口能够合作。这种模式涉及到一个称作适配器的类,它负责加入两个不同接口的功能。
在软件开发中,我们经常遇到需要将旧有系统或第三方库的API与当前系统的API进行整合的情况。由于这些API可能具有不同的接口规范,直接整合可能会导致兼容性问题。适配器模式就是为了解决这类问题而诞生的。
适配器模式的组成部分
- Target(目标接口):这是客户端期望的接口,它定义了客户端希望使用的方法。
- Adaptee(适配者):这是一个现有的、已经存在的接口,它可能需要适配以满足目标接口的要求。
- Adapter(适配器):这是适配器模式的核心。适配器实现了目标接口,并在内部包含对适配者的一个引用。它通过转换适配者的接口到目标接口,使得适配者能够在目标接口下工作。
适配器模式的种类
适配器模式通常分为两种类型:
- 类适配器(Class Adapter):在这种类型的适配器中,适配器是适配者的一个子类,或者是通过继承适配者来实现的。
- 对象适配器(Object Adapter):在这种类型的适配器中,适配器持有适配者的一个实例,而不是继承它。这允许适配器和适配者属于不同的类层次结构。
应用场景
适配器模式适用于以下场景:
- 系统需要使用现有的类。
- 想创建一个可以重用的类,该类可以与不相关的或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
- 需要与多个现有的不兼容类一起工作,这些类可能来自不同的库或框架。
实现步骤
- 定义目标接口,这是客户端期望调用的接口。
- 定义适配者类,这是现有的需要适配的接口。
- 创建适配器类,实现目标接口,并在内部处理如何调用适配者的方法。
- 客户端使用目标接口与适配器交互,而不需要关心背后是如何与适配者进行交互的。
二、测试例子
# 老版本的数据库API
class OldDatabase:
def connect(self):
print("Connected to old database")
def fetch_data(self):
return "Old data"
# 新版本的数据库API
class NewDatabase:
def connect(self):
print("Connected to new database")
def fetch_data(self):
return "New data, with more features!"
# 客户端代码期待旧的API
def use_database(db):
db.connect()
data = db.fetch_data()
print("Fetched:", data)
# 创建一个新的数据库对象,但是我们需要适配它的API
new_db = NewDatabase()
# 创建适配器类
class Adapter:
def __init__(self, adapted):
self._adapted = adapted
def connect(self):
self._adapted.connect()
def fetch_data(self):
return self._adapted.fetch_data()
# 使用适配器
adapter = Adapter(new_db)
use_database(adapter) # 输出: Connected to new database, Fetched: New data, with more features!
测试结果: