
就像珠宝行业中,普通顾客不会直接接触到价值连城的珠宝原石 / 成品,而是通过珠宝顾问(代理)来查看、试戴、购买 —— 代理会负责验证身份、登记信息、保护珠宝安全,再把请求转发给实际的珠宝对象。
我们以 “高端珠宝展示” 为场景: 真实对象(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.py
from dataclasses import dataclass # 用dataclass简化实体类定义(Python 3.7+)
from datetime import datetime
# ====================== 1. 核心实体类 ======================
@dataclass
class 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.py
from dataclasses import dataclass # 用dataclass简化实体类定义(Python 3.7+)
from datetime import datetime
# ====================== 1. 核心实体类 ======================
@dataclass
class 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.py
from abc import ABC, abstractmethod
from 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.py
from ProxyPattern.Customer import Customer
from ProxyPattern.HighEndJewelry import HighEndJewelry
from 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.py
from ProxyPattern.Customer import Customer
from ProxyPattern.HighEndJewelry import HighEndJewelry
from ProxyPattern.JewelryDisplay import JewelryDisplay
from ProxyPattern.RealJewelryDisplay import RealJewelryDisplay
from 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.py
from ProxyPattern.Customer import Customer
from ProxyPattern.HighEndJewelry import HighEndJewelry
from ProxyPattern.RealJewelryDisplay import RealJewelryDisplay
from 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 ProxyBll
if __name__ == '__main__':
# 代理模式 Proxy Pattern
proxyBll = ProxyBll()
proxyBll.demo()
print('hi,welcome geovindu.')输出:
