假设你是珠宝电商平台的开发者:
早期系统对接了「传统珠宝供应商 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.')
输出:
