就像珠宝行业中,普通顾客不会直接接触到价值连城的珠宝原石 / 成品,而是通过珠宝顾问(代理)来查看、试戴、购买 —— 代理会负责验证身份、登记信息、保护珠宝安全,再把请求转发给实际的珠宝对象。
我们以 “高端珠宝展示” 为场景:
真实对象(Real Subject):高端珠宝(如钻石项链),核心功能是展示珠宝细节。
代理对象(Proxy):珠宝顾问,控制对珠宝的访问(验证顾客身份、登记访问记录、保护珠宝)。
抽象主题(Subject):统一的 “可展示物品” 接口,保证真实对象和代理对象行为一致。
# encoding: utf-8# 版权所有 2026 ©涂聚文有限公司™ ®# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎# 描述:代理模式 Proxy 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/4 20:51# User : geovindu# Product : PyCharm# Project : pydesginpattern# File : Customer.pyfrom dataclasses import dataclass # 用dataclass简化实体类定义(Python 3.7+)from datetime import datetime# ====================== 1. 核心实体类 ======================@dataclassclass Customer: """ 顾客实体类 - 包含珠宝行业顾客核心属性 """ name: str """ 姓名 """ vip_level: int """ VIP等级(0=普通,1=银卡,2=金卡,3=钻石VIP) """ phone: str """ 联系方式 """ purchase_power: str """ 购买力评级(A=高,B=中,C=低) """ visit_count: int = 0 """ 累计到店次数(默认0) """ def is_diamond_vip(self) -> bool: """ 判断是否为钻石VIP(有权查看顶级珠宝) :return: """ return self.vip_level >= 3 def is_vip(self) -> bool: """ 判断是否为VIP(银卡及以上) :return: """ return self.vip_level >= 1# encoding: utf-8# 版权所有 2026 ©涂聚文有限公司™ ®# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎# 描述:代理模式 Proxy 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/4 20:53# User : geovindu# Product : PyCharm# Project : pydesginpattern# File : HighEndJewelry.pyfrom dataclasses import dataclass # 用dataclass简化实体类定义(Python 3.7+)from datetime import datetime# ====================== 1. 核心实体类 ======================@dataclassclass HighEndJewelry: """ 高端珠宝实体类 - 包含珠宝核心属性 """ jewelry_id: str # """ 珠宝唯一编号(如JN20260304001) """ name: str """ 珠宝名称(如「星辰」钻石项链) """ category: str """ 品类(项链/戒指/手镯) """ material: str """ 材质(18K白金/铂金/玫瑰金) """ weight_carat: float """ 主石重量(克拉) """ clarity: str """ 净度(IF=无瑕,VVS1=极微瑕,VS1=微瑕) """ cut: str """ 切工(理想/优秀/良好) """ price: float """ 售价(元) """ stock_status: bool = True """ 库存状态(True=有货,False=无货) """ def get_detail_str(self) -> str: """ 生成珠宝详情字符串(用于展示) :return: """ stock = "有货" if self.stock_status else "无货" return ( f"\n【{self.name} - {self.jewelry_id}】\n" f"├─ 品类:{self.category}\n" f"├─ 材质:{self.material}\n" f"├─ 主石重量:{self.weight_carat}ct\n" f"├─ 净度:{self.clarity}\n" f"├─ 切工:{self.cut}\n" f"├─ 售价:¥{self.price:,.2f}\n" f"└─ 库存状态:{stock}" )
# encoding: utf-8# 版权所有 2026 ©涂聚文有限公司™ ®# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎# 描述: 代理模式 Proxy 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/4 20:57# User : geovindu# Product : PyCharm# Project : pydesginpattern# File : JewelryDisplay.pyfrom abc import ABC, abstractmethodfrom ProxyPattern.Customer import Customer# ====================== 2. 代理模式核心接口与实现 ======================class JewelryDisplay(ABC): """ 珠宝展示抽象接口 """ @abstractmethod def show_details(self, customer: Customer): """ :param customer:顾客实体 :return: """ pass# encoding: utf-8# 版权所有 2026 ©涂聚文有限公司™ ®# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎# 描述: 代理模式 Proxy 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/4 20:59# User : geovindu# Product : PyCharm# Project : pydesginpattern# File : RealJewelryDisplay.pyfrom ProxyPattern.Customer import Customerfrom ProxyPattern.HighEndJewelry import HighEndJewelryfrom ProxyPattern.JewelryDisplay import JewelryDisplay# ====================== 2. 代理模式核心接口与实现 ======================class RealJewelryDisplay(JewelryDisplay): """ 真实展示类 - 仅负责核心的珠宝详情展示 """ def __init__(self, jewelry: HighEndJewelry): """ :param jewelry: 商端珠宝 """ self.jewelry = jewelry # 关联具体的珠宝实体 def show_details(self, customer: Customer): """ :param customer: 顾客实体 :return: """ """展示珠宝详情(核心业务逻辑)""" print(f"\n🔍 为{customer.name}展示珠宝详情:{self.jewelry.get_detail_str()}")# encoding: utf-8# 版权所有 2026 ©涂聚文有限公司™ ®# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎# 描述: 代理模式 Proxy 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/4 21:01# User : geovindu# Product : PyCharm# Project : pydesginpattern# File : JewelryAdvisorProxy.pyfrom ProxyPattern.Customer import Customerfrom ProxyPattern.HighEndJewelry import HighEndJewelryfrom ProxyPattern.JewelryDisplay import JewelryDisplayfrom ProxyPattern.RealJewelryDisplay import RealJewelryDisplayfrom datetime import datetime# ====================== 2. 代理模式核心接口与实现 ======================class JewelryAdvisorProxy(JewelryDisplay): """ 珠宝顾问代理类 - 控制访问+扩展功能 """ def __init__(self, real_display: RealJewelryDisplay): """ :param real_display: """ self.real_display = real_display # 持有真实展示对象的引用 self.visit_records = [] # 存储所有访问记录 def _check_access_permission(self, customer: Customer) -> bool: """ 代理功能1:精细化权限校验 :param customer: 顾客实体 :return: """ jewelry = self.real_display.jewelry # 规则:1. 顶级珠宝(克拉≥2)仅钻石VIP可看;2. 普通VIP可看克拉<2的珠宝;3. 非VIP无权限 if jewelry.weight_carat >= 2: if customer.is_diamond_vip(): print(f"✅ 权限通过:{customer.name}(钻石VIP)可查看顶级珠宝(≥2ct)") return True else: print(f"❌ 权限不足:{customer.name}(VIP等级{customer.vip_level})无法查看≥2ct的顶级珠宝") return False elif customer.is_vip(): print(f"✅ 权限通过:{customer.name}(VIP等级{customer.vip_level})可查看常规高端珠宝(<2ct)") return True else: print(f"❌ 权限不足:{customer.name}(普通顾客)无查看高端珠宝权限") return False def _record_visit_info(self, customer: Customer): """ 代理功能2:记录详细的访问信息 :param customer: 顾客实体 :return: """ customer.visit_count += 1 # 更新顾客到店次数 record = { "customer_name": customer.name, "jewelry_id": self.real_display.jewelry.jewelry_id, "visit_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), "visit_count": customer.visit_count } self.visit_records.append(record) print(f"📝 访问记录已保存:{customer.name}第{customer.visit_count}次到店,查看{self.real_display.jewelry.name}") def _remind_purchase(self, customer: Customer): """ 代理功能3:根据顾客购买力给出购买提醒(扩展功能) :param customer: :return: """ if customer.purchase_power == "A" and self.real_display.jewelry.stock_status: print(f"💡 顾问提醒:{customer.name}(高购买力),该珠宝库存充足,可推荐下单") def show_details(self, customer: Customer): """ 代理核心逻辑:校验权限 → 记录信息 → 展示详情 → 额外提醒 :param customer: 顾客实体 :return: """ if self._check_access_permission(customer): self._record_visit_info(customer) self.real_display.show_details(customer) # 转发请求到真实对象 self._remind_purchase(customer) def get_visit_records(self): """ 查看所有访问记录(代理的扩展功能) :return: """ print("\n📜 所有珠宝访问记录:") for idx, record in enumerate(self.visit_records, 1): print(f"{idx}. {record['visit_time']} - {record['customer_name']} - 查看{record['jewelry_id']}(第{record['visit_count']}次到店)")
# encoding: utf-8# 版权所有 2026 ©涂聚文有限公司™ ®# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎# 描述:代理模式 Proxy 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/4 21:05# User : geovindu# Product : PyCharm# Project : pydesginpattern# File : ProxyBll.pyfrom ProxyPattern.Customer import Customerfrom ProxyPattern.HighEndJewelry import HighEndJewelryfrom ProxyPattern.RealJewelryDisplay import RealJewelryDisplayfrom ProxyPattern.JewelryAdvisorProxy import JewelryAdvisorProxy# ====================== 3. 测试代码 ======================class ProxyBll(object): """ """ def demo(self): """ """ # 1. 创建珠宝实体(2个不同等级的钻石项链) top_necklace = HighEndJewelry( jewelry_id="JN20260304001", name="「星辰」钻石项链", category="项链", material="18K白金", weight_carat=2.5, # 顶级珠宝(≥2ct) clarity="IF", cut="理想", price=1280000.00 ) normal_necklace = HighEndJewelry( jewelry_id="JN20260304002", name="「微光」钻石项链", category="项链", material="18K玫瑰金", weight_carat=1.2, # 常规高端珠宝(<2ct) clarity="VVS1", cut="优秀", price=388000.00 ) # 2. 创建不同类型的顾客 diamond_vip = Customer( name="王总", vip_level=3, phone="13800138000", purchase_power="A" ) gold_vip = Customer( name="李女士", vip_level=2, phone="13900139000", purchase_power="B" ) normal_customer = Customer( name="小明", vip_level=0, phone="13700137000", purchase_power="C" ) # 3. 测试顶级珠宝的访问控制 print("=== 测试1:顶级珠宝(2.5ct)访问控制 ===") top_jewelry_display = RealJewelryDisplay(top_necklace) top_advisor = JewelryAdvisorProxy(top_jewelry_display) top_advisor.show_details(diamond_vip) # 钻石VIP可看 top_advisor.show_details(gold_vip) # 金卡VIP不可看 top_advisor.show_details(normal_customer) # 普通顾客不可看 # 4. 测试常规高端珠宝的访问控制 print("\n=== 测试2:常规高端珠宝(1.2ct)访问控制 ===") normal_jewelry_display = RealJewelryDisplay(normal_necklace) normal_advisor = JewelryAdvisorProxy(normal_jewelry_display) normal_advisor.show_details(gold_vip) # 金卡VIP可看 normal_advisor.show_details(normal_customer) # 普通顾客不可看 # 5. 查看访问记录 print("\n=== 测试3:查看所有访问记录 ===") top_advisor.get_visit_records() normal_advisor.get_visit_records()
调用:
# encoding: utf-8# 版权所有 2026 ©涂聚文有限公司™ ®# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎# 描述:# 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 : 学习from bll.ProxyBll import ProxyBllif __name__ == '__main__': # 代理模式 Proxy Pattern proxyBll = ProxyBll() proxyBll.demo() print('hi,welcome geovindu.')