当前位置:首页>python>python: Proxy Pattern

python: Proxy Pattern

  • 2026-09-23 17:39:53
python: Proxy Pattern

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

我们以 “高端珠宝展示” 为场景:

真实对象(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.')
输出:

最新文章

随机文章