1. 一句话介绍
适配器模式是一种软件设计模式,它允许不兼容的接口协同工作,通过引入一个中间层(适配器)来转换一个类的接口,使其能够满足客户端的期望。
2. 详细介绍
适配器模式有两种实现方式:对象适配器和类适配器。对象适配器通过组合方式实现,适配器类包含一个指向适配者对象的引用;类适配器通过继承实现,适配器类继承自适配者类并实现目标接口。
2.1 模式结构
适配器模式包含四个主要角色:
- Target(目标抽象类):定义客户端使用的特定领域的接口。
- Adapter(适配器类):作为转换器,实现目标接口,并与适配者类交互,是适配器模式的核心。
- Adaptee(适配者类):被适配的角色,定义了一个已经存在的接口,这个接口需要适配。
- Client(客户类):针对目标抽象类进行编程,调用目标抽象类中定义的业务方法。
2.2 如何调用适配器模式相关的对象
客户端首先创建适配者对象,然后创建适配器对象并将适配者对象传递给适配器。客户端通过适配器的request(可以是适配者的任意方法,不一定是request)方法发起调用,适配器内部调用适配者对象的specificRequest方法。
3. 使用场景以及优缺点
- 使用场景:
- 系统需要使用现有的类,而这些类的接口不符合系统的需要。
- 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类一起工作。
- 优点:
- 解耦目标类和适配者类,通过适配器类重用现有的适配者类,而无需修改原有代码。
- 增加类的透明性和复用性,客户端对适配者类的实现细节一无所知。
- 系统灵活性和扩展性高,可以方便地更换或增加适配器类。
- 缺点:
- 类适配器模式在不支持多重继承的语言中使用受限,不能同时适配多个适配者类。
- 对象适配器模式置换适配者类的方法较为复杂,需要创建适配者类的子类。
4. 使用Python实现适配器模式
# 目标抽象类
class Target:
def request(self):
pass
# 适配者类
class Adaptee:
def specificRequest(self):
print("Adaptee: 特定请求的具体实现。")
# 适配器类
class Adapter(Target):
def __init__(self, adaptee):
self.adaptee = adaptee
def request(self):
self.adaptee.specificRequest()
# 客户端代码
def clientCode(target):
target.request()
# 创建适配者对象
adaptee = Adaptee()
# 创建适配器对象,将适配者传递给适配器
adapter = Adapter(adaptee)
# 客户端针对目标编程,调用适配器的request方法
clientCode(adapter)
上述Python代码展示了适配器模式的实现,其中Target是目标抽象类,Adaptee是被适配的类,Adapter是适配器类,它组合了Adaptee对象并通过request方法将调用转发到Adaptee的specificRequest方法。最后,客户端通过适配器对象调用request方法,实现了对Adaptee的适配。
5. 简单练习【设计模式专题之适配器模式】6. 扩展坞
"""
【设计模式专题之适配器模式】6. 扩展坞
时间限制:1.000S 空间限制:256MB
题目描述
小明购买了一台新电脑,该电脑使用 TypeC 接口,他已经有了一个USB接口的充电器和数据线,为了确保新电脑可以使用现有的USB接口充电器和数据线,他购买了一个TypeC到USB的扩展坞。
请你使用适配器模式设计并实现这个扩展坞系统,确保小明的新电脑既可以通过扩展坞使用现有的USB接口充电线和数据线,也可以使用TypeC接口充电。
输入描述
题目包含多行输入,第一行输入一个数字 N (1 < N <= 20),表示后面有N组测试数据。
之后N行都是一个整数,1表示使用电脑本身的TypeC接口,2表示使用扩展坞的USB接口充电。
输出描述
根据每行输入,输出相应的充电信息。
输入示例
3
1
2
1
输出示例
TypeC
USB Adapter
TypeC
"""
from abc import ABC, abstractmethod
class TypeC(ABC):
@abstractmethod
def charge(self):
raise NotImplemented
class NewComputer(TypeC):
def charge(self):
print("TypeC")
class USB(ABC):
@abstractmethod
def charge(self):
raise NotImplemented
class UsbCharger(USB):
def charge(self, msg: str):
print(msg)
class UsbChargerAdapter:
def __init__(self, adaptee: UsbCharger):
self.adaptee = adaptee
def charge(self):
self.adaptee.charge("USB Adapter")
def client():
n = int(input())
for _ in range(n):
i = int(input())
if i == 1:
charger = NewComputer()
# if i == 2:
else:
assert i == 2
charger = UsbChargerAdapter(UsbCharger())
charger.charge()
if __name__ == "__main__":
client()