如何创建可适配两个不同数据机器类的适配器?
为不同数据机器类创建适配器的实现方案
要让DataMachineA和DataMachineB这两个接口不一致的类能够被统一调用,我们可以用适配器模式包装其中一个类,使其接口匹配另一个类的标准,或者定义通用接口让两者都适配。
核心思路
两个类的核心差异:
DataMachineA通过get_data(i)返回(duration, type, value)DataMachineB通过fetch(i)返回(time, measurement, type)
我们需要创建适配器,将DataMachineB的接口和返回格式转换为与DataMachineA一致的形式,让调用方可以统一使用get_data方法获取数据。
代码实现
1. 基础适配器实现
创建包装DataMachineB的适配器,将fetch方法转换为get_data,同时调整返回值的字段顺序:
class MachineBAdapter: def __init__(self, machine_b): self.machine_b = machine_b # 持有DataMachineB实例 def get_data(self, i): # 调用DataMachineB的原生方法,重新映射字段顺序 time, measurement, type_ = self.machine_b.fetch(i) # 转换为DataMachineA的返回格式:(时长, 类型, 数值) return (time, type_, measurement)
2. 统一调用示例
现在可以用完全相同的方式调用两个类的接口:
# 初始化原类实例 machine_a = DataMachineA() machine_b = DataMachineB() # 用适配器包装DataMachineB adapter_b = MachineBAdapter(machine_b) # 统一调用get_data方法 print("DataMachineA 数据:", machine_a.get_data(0)) # 输出: (5, 'A', 1) print("适配后的DataMachineB 数据:", adapter_b.get_data(0)) # 输出: (50, 'D', 10)
3. 进阶:用抽象基类规范接口
如果需要更严格的接口约束,可以定义抽象基类,让DataMachineA和适配器都实现该接口:
from abc import ABC, abstractmethod # 定义通用数据机器接口 class DataMachine(ABC): @abstractmethod def get_data(self, i): pass # 让DataMachineA实现通用接口 class DataMachineA(DataMachine): def __init__(self): self.data = {"type": ["A", "A", "B", "B"], "value": [1, 2, 3, 4], "description": ["text1", "text2", "text2", "text3"], "duration": [5, 6, 7, 8]} def get_data(self, i): return self.data["duration"][i], self.data["type"][i], self.data["value"][i] # 适配器也实现通用接口 class MachineBAdapter(DataMachine): def __init__(self, machine_b): self.machine_b = machine_b def get_data(self, i): time, measurement, type_ = self.machine_b.fetch(i) return (time, type_, measurement)
此时可以编写通用处理函数,无需关心具体是哪个类的实例:
def process_data(machine: DataMachine, index: int): duration, type_, value = machine.get_data(index) print(f"处理结果:时长={duration},类型={type_},数值={value}") process_data(machine_a, 1) process_data(adapter_b, 1)
关键说明
适配器模式的本质是接口转换,通过包装现有类隐藏内部差异,对外提供统一调用方式。这种方式无需修改原类代码,符合开闭原则。
内容的提问来源于stack exchange,提问作者amalelwatta
相关产品推荐
相关产品推荐

