You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建可适配两个不同数据机器类的适配器?

为不同数据机器类创建适配器的实现方案

要让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 20:05:17