python: Adapter Pattern

假设你是珠宝电商平台的开发者:

早期系统对接了「传统珠宝供应商 A」,其提供的接口返回的珠宝数据是字典格式,且字段是中文(如{"名称": "黄金项链", "克重": 5.2, "材质": "足金", "供货价": 2800});

新拓展的「国际珠宝供应商 B」,接口返回的是类对象格式,字段是英文(如Jewelry(name="Diamond Ring", carat=0.5, material="platinum", price=12000));

你的业务流程(如价格计算、库存入库、订单生成)只认统一的「标准化接口」(要求返回JewelryEntity对象,包含name/weight/material/cost字段)。

此时需要用适配器模式,把两个供应商的不同接口适配成统一的标准化接口,让业务流程无需修改就能兼容所有供应商。

python 复制代码
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:适配器 Adapter Pattern
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/3/8 11:56
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : DuJewelryEntity.py
 
# ---1:定义统一的珠宝实体类(业务核心属性)---
 
 
class DuJewelryEntity:
    """
    珠宝实体类:业务流程统一依赖的核心实体(包含珠宝核心属性)
    """
    def __init__(self, name: str, weight: float, material: str, cost: float):
        """
 
        :param name: 珠宝名称(如黄金项链、钻石戒指)
        :param weight: 重量(黄金按克,钻石按克拉)
        :param material: 材质(足金、铂金、钻石)
        :param cost: 供货成本价
        """
        self.name = name
        """
        珠宝名称(如黄金项链、钻石戒指) 
        """
        self.weight = weight
        """
        重量(黄金按克,钻石按克拉)
        """
        self.material = material
        """
        材质(足金、铂金、钻石)
        """
        self.cost = cost
        """
        供货成本价
        """
 
    def __repr__(self):
        """
 
        :return:
        """
        return f"DuJewelryEntity(name='{self.name}', weight={self.weight}, material='{self.material}', cost={self.cost})"
python 复制代码
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:适配器Adapter Pattern
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/3/8 12:00
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : InternationalJewelry.py
 
# -------------- 2 国际珠宝供应商B(类对象接口)--------------
class InternationalJewelry:
    """
    国际供应商B返回的原始珠宝类(英文字段)
    """
    def __init__(self, name: str, carat: float, material: str, price: float):
        """
 
        :param name: 名称(英文)
        :param carat: 克拉(钻石重量单位)
        :param material: 材质(英文)
        :param price: 价格(美元)
        """
        self.name = name      # 名称(英文)
        self.carat = carat    # 克拉(钻石重量单位)
        self.material = material  # 材质(英文)
        self.price = price    # 价格(美元)
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:适配器Adapter Pattern
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/3/8 12:01
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : TraditionalJewelrySupplierA.py
 
# --------------2 传统珠宝供应商A(中文字典接口)--------------
 
class TraditionalJewelrySupplierA:
    """
    传统珠宝供应商A:返回中文字典格式的珠宝数据
    """
    def get_jewelry_data(self):
        """
 
        :return:
        """
        # 模拟从供应商A接口获取数据(黄金项链,克重5.2克,足金,供货价2800元)
        return {
            "名称": "黄金项链",
            "克重": 5.2,
            "材质": "足金",
            "供货价": 2800.0
        }
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:适配器Adapter Pattern
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/3/8 12:02
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : InternationalJewelrySupplierB.py
from Interface.Adapter.InternationalJewelry import InternationalJewelry
 
# -------------- 2 国际珠宝供应商B(类对象接口)--------------
 
class InternationalJewelrySupplierB:
    """
    国际珠宝供应商B:返回自定义类对象格式的珠宝数据
    """
    def fetch_jewelry_info(self)->InternationalJewelry:
        """
 
        :return:
        """
        # 模拟从供应商B接口获取数据(钻石戒指,0.5克拉,铂金,供货价12000美元)
        return InternationalJewelry(
            name="Diamond Ring",
            carat=0.5,
            material="platinum",
            price=12000.0
        )
python 复制代码
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:适配器Adapter Pattern
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/3/8 12:05
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : JewelryAdapter.py
from Model.Adapter.DuJewelryEntity import DuJewelryEntity
 
# ---- 3:定义适配器接口(统一标准)
from abc import ABC, abstractmethod
 
class JewelryAdapter(ABC):
    """
    珠宝适配器抽象接口:定义统一的转换方法
    """
    @abstractmethod
    def convert_to_entity(self) -> DuJewelryEntity:
        """
        将供应商原始数据转换为统一的DuJewelryEntity实体
        :return:
        """
        pass
python 复制代码
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:适配器Adapter Pattern
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/3/8 12:07
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : SupplierAAdapter.py
from Model.Adapter.DuJewelryEntity import DuJewelryEntity
from Interface.Adapter.JewelryAdapter import JewelryAdapter
from Interface.Adapter.TraditionalJewelrySupplierA import TraditionalJewelrySupplierA
 
 
# ---4:实现具体适配器(适配不同接口)
# -------------- 供应商A的适配器 --------------
class SupplierAAdapter(JewelryAdapter):
    """
    适配传统供应商A的字典接口,转换为标准JewelryEntity
    """
    def __init__(self, supplier: TraditionalJewelrySupplierA):
        """
 
        :param supplier:
        """
        self.supplier = supplier  # 持有被适配的供应商对象
 
    def convert_to_entity(self) -> DuJewelryEntity:
        """
 
        :return:
        """
        # 1. 获取原始字典数据
        raw_data = self.supplier.get_jewelry_data()
        # 2. 映射字段:中文字典 → 标准实体(核心属性转换)
        return DuJewelryEntity(
            name=raw_data["名称"],
            weight=raw_data["克重"],  # 黄金克重直接作为重量
            material=raw_data["材质"],
            cost=raw_data["供货价"]
        )
 
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:适配器 Adapter Pattern
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/3/8 12:09
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : SupplierBAdapter.py
from Model.Adapter.DuJewelryEntity import DuJewelryEntity
from Interface.Adapter.JewelryAdapter import JewelryAdapter
from Interface.Adapter.InternationalJewelrySupplierB import InternationalJewelrySupplierB
 
# ---4:实现具体适配器(适配不同接口)
 
# -------------- 供应商B的适配器 --------------
class SupplierBAdapter(JewelryAdapter):
    """
    适配国际供应商B的类对象接口,转换为标准JewelryEntity
    """
    def __init__(self, supplier: InternationalJewelrySupplierB):
        """
 
        :param supplier:
        """
        self.supplier = supplier  # 持有被适配的供应商对象
 
    def convert_to_entity(self) -> DuJewelryEntity:
        """
 
        :return:
        """
        # 1. 获取原始类对象数据
        raw_obj = self.supplier.fetch_jewelry_info()
        # 2. 映射字段:英文类对象 → 标准实体(含单位/语言转换)
        # 补充业务逻辑:将铂金的英文"platinum"转为中文"铂金",克拉作为重量单位
        material_cn = "铂金" if raw_obj.material == "platinum" else raw_obj.material
        return DuJewelryEntity(
            name=f"【进口】{raw_obj.name}",  # 业务规则:进口珠宝加前缀
            weight=raw_obj.carat,  # 钻石克拉作为重量
            material=material_cn,
            cost=raw_obj.price * 7.2  # 业务规则:美元换算人民币(汇率7.2)
        )
  
python 复制代码
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:适配器Adapter Pattern
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/3/8 12:10
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : JewelryBusinessFlow.py
 
from Interface.Adapter.JewelryAdapter import JewelryAdapter
 
#  ----5:业务流程调用(统一处理所有供应商)
 
class JewelryBusinessFlow:
    """
    珠宝核心业务流程:入库 → 定价 → 生成订单(依赖统一的JewelryEntity)
    """
    def __init__(self, adapter: JewelryAdapter):
        """
 
        :param adapter:
        """
        self.adapter = adapter  # 注入适配器(面向接口编程)
 
    def process_jewelry(self):
        """
 
        :return:
        """
        # 1. 适配转换:统一获取标准珠宝实体
        jewelry = self.adapter.convert_to_entity()
        print(f"✅ 1. 珠宝入库:{jewelry}")
 
        # 2. 定价业务:成本价上浮30%作为售价(珠宝行业通用定价规则)
        selling_price = jewelry.cost * 1.3
        print(f"✅ 2. 定价完成:售价 = {selling_price:.2f} 元")
 
        # 3. 生成订单(简化版)
        order = {
            "珠宝名称": jewelry.name,
            "材质": jewelry.material,
            "重量": jewelry.weight,
            "成本价": jewelry.cost,
            "售价": selling_price,
            "订单状态": "待发货"
        }
        print(f"✅ 3. 生成订单:{order}\n")
python 复制代码
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:适配器 Adapter Pattern
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/3/8 12:14
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : AdapterBll.py
from AdapterPattern.JewelryBusinessFlow import JewelryBusinessFlow
from Interface.Adapter.TraditionalJewelrySupplierA import TraditionalJewelrySupplierA
from Interface.Adapter.InternationalJewelrySupplierB import InternationalJewelrySupplierB
from Interface.Adapter.SupplierAAdapter import SupplierAAdapter
from Interface.Adapter.SupplierBAdapter import SupplierBAdapter
 
 
# ------------------- 6 测试业务流程 -------------------
 
class AdapterBll(object):
    """
 
    """
    def demo(self):
        """
 
        :return:
        """
        # 1. 处理传统供应商A的珠宝(黄金项链)
        print("===== 处理传统供应商A的珠宝 =====")
        supplier_a = TraditionalJewelrySupplierA()
        adapter_a = SupplierAAdapter(supplier_a)
        business_a = JewelryBusinessFlow(adapter_a)
        business_a.process_jewelry()
 
        # 2. 处理国际供应商B的珠宝(钻石戒指)
        print("===== 处理国际供应商B的珠宝 =====")
        supplier_b = InternationalJewelrySupplierB()
        adapter_b = SupplierBAdapter(supplier_b)
        business_b = JewelryBusinessFlow(adapter_b)
        business_b.process_jewelry()

调用:

python 复制代码
# encoding: utf-8
# 版权所有 2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述: 设计模式 Design Patterns
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2023.1 python 3.11
# OS        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  oracle 21c Neo4j
# Datetime  : 2026/2/18 20:58
# User      : geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : main.py
# explain   : 学习
 
import Controller.CheckPatterns
 
 
def select_design_pattern() -> tuple[int, Controller.CheckPatterns.DesignPattern | None]:
    """
    返回 (序列号, 选中的枚举对象),退出则返回 (0, None)
    :return:
    """
    print("\n=== 方式3:用户选择展示 ===")
    print("可选设计模式(输入0或q退出):")
    for idx, pattern in enumerate(Controller.CheckPatterns.DesignPattern, 1):
        print(f"{idx}. {pattern._name_to_cn(pattern.name)}({pattern.name})")
    print("0. 退出")
 
    while True:
        user_input = input("\n请输入序号选择要展示的设计模式(输入0/q退出):").strip()
        if user_input in ("0", "q", "Q"):
            print("👋 退出选择流程")
            return (0, None)
 
        try:
            choice = int(user_input)
            if 1 <= choice <= len(Controller.CheckPatterns.DesignPattern):
                selected_pattern = list(Controller.CheckPatterns.DesignPattern)[choice - 1]
                print(f"✅ 你选择了序号:{choice}(对应{selected_pattern._name_to_cn(selected_pattern.name)})")
                return (choice, selected_pattern)  # 返回(序列号, 枚举对象)
            else:
                print(f"❌ 输入无效!请输入1-{len(Controller.CheckPatterns.DesignPattern)}之间的数字,或0/q退出")
        except ValueError:
            print("❌ 输入无效!请输入数字序号,或0/q退出")
 
def ask_continue() -> bool:
    """
    询问用户是否继续选择,返回True(继续)/False(退出)
    """
    while True:
        user_choice = input("\n是否继续选择其他设计模式?(y/n):").strip().lower()
        if user_choice == "y":
            return True
        elif user_choice == "n":
            print("👋 感谢使用,程序结束!")
            return False
        else:
            print("❌ 输入无效!请输入 y(继续)或 n(退出)")
 
 
if __name__ == '__main__':
 
    # 方式1:用户输入选择展示(交互版)
    '''
    print("\n=== 方式1:用户选择展示 ===")
    print("可选设计模式:")
    for idx, pattern in enumerate( bll.CheckPatterns.DesignPattern, 1):
        print(f"{idx}. {pattern._name_to_cn(pattern.name)}({pattern.name})")
 
    try:
        choice = int(input("\n请输入序号选择要展示的设计模式:"))
        selected_pattern = list( bll.CheckPatterns.DesignPattern)[choice - 1]
        selected_pattern.show_example()
    except (ValueError, IndexError):
        print("❌ 输入无效,请输入正确的序号!")
    '''
    # 2
 
    print("🎉 设计模式示例展示程序")
    while True:
        # 1. 选择设计模式
        selected_num, selected_pattern = select_design_pattern()
 
        # 2. 判断是否直接退出(输入0/q)
        if selected_num == 0:
            print("👋 程序结束!")
            break
 
        # 3. 执行选中的示例
        selected_pattern.show_example()
        print(f"\n📌 本次选择的序列号是:{selected_num}")
 
        # 4. 询问是否继续
        if not ask_continue():
            break  # 用户选择不继续,终止循环
 
    print('hi,welcome geovindu.')

输出:

相关推荐
逆境不可逃2 小时前
【从零入门23种设计模式15】行为型之解释器模式
设计模式·解释器模式
蜜獾云2 小时前
设计模式之工厂方法模式(5):稍微复杂一点的工厂模式
java·设计模式·工厂方法模式
Voyager_42 小时前
吃透设计模式:从原理到落地(如何选型),Java/Spring开发场景
java·spring·设计模式
技术人生黄勇2 小时前
微信接入|企业微信官方插件支持 OpenClaw 3步快速接入(实操版)
java·前端·人工智能·微信·企业微信
崔小汤2 小时前
SpringAI实战之结构化输出
java·ai
Lin_林2 小时前
国内 Docker 服务状态 & 镜像加速监控
java·开发语言
予枫的编程笔记2 小时前
【面试专栏|JVM虚拟机】从Serial到ZGC,JVM垃圾收集器进化史
java·jvm·垃圾收集器·zgc·g1 gc·serial gc·cms gc
逝水如流年轻往返染尘2 小时前
java中类和对象
java
*.✧屠苏隐遥(ノ◕ヮ◕)ノ*.✧2 小时前
Java 集合 (Collection)
java·开发语言