Python 设计模式之适配者模式

文章目录

从电源适配器谈起

适配者模式属于结构型设计模式,它的目的是使不兼容的两个对象能够相互工作。

常见的生活例子:去欧美国家旅游时,由于插口和电压不一样,用中国国内的充电器并不能充电,需要借助电源适配器解决问题。
不能工作 phone 220v 国标插口的充电器 110v 电源英标插座接口 电源适配器

为了解决电源适配问题去买了电源适配器,这个过程中没有改造自己的 220v国标插口的充电器,也没有找一个国标插座电源插口。

在这个 case 中,220v 国标插口的充电器110v 电源英标插座接口 就是代码中两个类对象,为了让它们能顺利工作,通过引入一个 adapter 来解决兼容问题。

可以看到,adapter 模式由三个部分组成:

  • Target 目标接口 (110v 电源英标插座接口)
  • adapter 适配器 (电源适配器)
  • adaptee 被适配的接口 (220v 国标插口的充电器)

下面将直接使用以上的英文指代角色

实现适配器模式的两种方式

关于适配器模式的实现分为两种方式:

  • object adapter
  • class adapter

object adapter

对象适配器,这种方式比较符合我们的经验习惯,先看下它的实现结构图

可以看到这种方式是让 adapter 实现 target 的接口(110v_voltage()),而这个接口函数的实现实际上是封装了 adaptee.220v_voltage()

用代码实现这个案例:

python 复制代码
class Voltage110V:
    def voltage_110v(self):
        return "110V"

class Voltage220V:
    def voltage_220v(self):
        return "220V"

class VoltageAdapter:
    def __init__(self, voltage220v: Voltage220V):
        self.voltage220v = voltage220v

    def voltage_110v(self):
        # 这里实现从 220V 转换到 110V
        voltage = self.voltage220v.voltage_220v()
        return f"{voltage} adapted to 110V"

# 在欧式国家中使用 110V
appliance = Voltage110V()
print(appliance.voltage_110v())  # 输出: 110V

# 中国只支持 220V
china_appliance = Voltage220V()

# 使用电源适配器让中国标准的电器能在欧洲电源接口中充电
adapter = VoltageAdapter(china_appliance)
print(adapter.voltage_110v())  # 输出: 220V adapted to 110V

Question: object adapter 为什么叫对象适配器?

python 复制代码
adapter = VoltageAdapter(china_appliance)

在这段代码里我们封装了 adaptee 对象(即Voltage220v实例对象),并用这个对象调用其不兼容的函数。

class adapter

类适配器, 这种实现方式是通过同时继承 adapteetarget,并对其中 target 的接口函数进行重写来达到目的。它和 object adapter 的区别在于使用的时候,它不再需要传入 adaptee 对象,而是可以直接使用(它已经在类的层面做了适配)。

具体看下面的实现:

python 复制代码
class Voltage110V:
    def voltage_110v(self):
        return "110V"

class Voltage220V:
    def voltage_220v(self):
        return "220V"

class VoltageAdapter(Voltage110V, Voltage220V):
    def voltage_110v(self):
        # 这里实现从 220V 转换到 110V
        voltage = self.voltage_220v()
        return f"{voltage} adapted to 110V"

# 使用电源适配器让中国标准的电器能在欧洲电源接口中充电
adapter = VoltageAdapter()
print(adapter.voltage_110v())  # 输出: 220V adapted to 110V

注:上面的实现实际上可以不继承 Voltage220V

相关推荐
数据科学小丫28 分钟前
Python 数据存储操作_数据存储、补充知识点:Python 与 MySQL交互
数据库·python·mysql
Knight_AL31 分钟前
Nacos 启动问题 Failed to create database ’D:\nacos\nacos\data\derby-data’
开发语言·数据库·python
leiming61 小时前
CAN 通信协议学习讲义(带图文 + C 语言代码)
c语言·开发语言·学习
xht08322 小时前
PHP vs C语言:核心差异全解析
c语言·开发语言·php
yoothey2 小时前
Java字节流与字符流核心笔记(问答+考点复盘)
java·开发语言·笔记
查古穆2 小时前
python进阶-Pydantic模型
开发语言·python
沐知全栈开发2 小时前
Bootstrap4 导航栏
开发语言
kyriewen112 小时前
异步编程:从“回调地狱”到“async/await”的救赎之路
开发语言·前端·javascript·chrome·typescript·ecmascript·html5
AI+程序员在路上2 小时前
嵌入式软件技术大全
linux·开发语言·arm开发·单片机
吴声子夜歌2 小时前
JavaScript——数据类型
开发语言·javascript·ecmascript