首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >python: Proxy Pattern

python: Proxy Pattern

作者头像
geovindu
发布2026-06-18 18:03:00
发布2026-06-18 18:03:00
1190
举报

就像珠宝行业中,普通顾客不会直接接触到价值连城的珠宝原石 / 成品,而是通过珠宝顾问(代理)来查看、试戴、购买 —— 代理会负责验证身份、登记信息、保护珠宝安全,再把请求转发给实际的珠宝对象。

我们以 “高端珠宝展示” 为场景: 真实对象(Real Subject):高端珠宝(如钻石项链),核心功能是展示珠宝细节。 代理对象(Proxy):珠宝顾问,控制对珠宝的访问(验证顾客身份、登记访问记录、保护珠宝)。 抽象主题(Subject):统一的 “可展示物品” 接口,保证真实对象和代理对象行为一致。

代码语言:javascript
复制
# 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}"
        )
代码语言:javascript
复制
# 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']}次到店)")
代码语言:javascript
复制
# 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()

调用:

代码语言:javascript
复制
# 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.')

输出:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-06-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档