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

python: Facade Pattern

作者头像
geovindu
发布2026-06-18 19:08:49
发布2026-06-18 19:08:49
590
举报

你去珠宝店定制钻戒,不需要自己去对接钻石采购、戒托制作、珠宝鉴定、证书办理等多个部门(子系统),只需要告诉珠宝顾问(门面)你的需求,顾问会帮你协调所有环节,你只需要最终取货即可。 我们模拟珠宝店定制钻戒的场景,涉及 4 个子系统: 钻石采购子系统:根据参数(克拉、净度)采购钻石 戒托制作子系统:根据材质(铂金 / 18K 金)制作戒托 珠宝镶嵌子系统:将钻石镶嵌到戒托上 证书办理子系统:为成品钻戒办理鉴定证书

代码语言:javascript
复制
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:外观模式 Facade 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/7 13:04
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : Diamond.py
 
 
# ---------------------- 1. 定义珠宝实体类(承载属性) ----------------------
 
class Diamond:
    """
    钻石实体类:封装钻石核心属性
    """
    def __init__(self, carat: float, clarity: str):
        """
 
        :param carat:
        :param clarity:
        """
        self.carat = carat  # 克拉数
        self.clarity = clarity  # 净度(VS1/VVS1等)
 
    def __str__(self):
        """
 
        :return:
        """
        return f"钻石({self.carat}克拉,净度{self.clarity})"
 
 
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:外观模式 Facade 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/7 13:05
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : RingSetting.py
 
# ---------------------- 1. 定义珠宝实体类(承载属性) ----------------------
 
class RingSetting:
    """
    戒托实体类:封装戒托核心属性
    """
    def __init__(self, material: str):
        """
 
        :param material:
        """
        self.material = material  # 材质(铂金/18K金)
 
    def __str__(self):
        """
 
        :return:
        """
        return f"戒托(材质:{self.material})"
 
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:外观模式 Facade 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/7 13:07
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : DiamondRing.py
 
from FacadePattern.Diamond import Diamond
from FacadePattern.RingSetting import RingSetting
 
 
# ---------------------- 1. 定义珠宝实体类(承载属性) ----------------------
 
class DiamondRing:
    """
    成品钻戒实体类:聚合钻石+戒托,封装成品属性
    """
    def __init__(self, ring_id: str, diamond: Diamond, ring_setting: RingSetting, cert_id: str):
        """
 
        :param ring_id:
        :param diamond:
        :param ring_setting:
        :param cert_id:
        """
        self.ring_id = ring_id  # 钻戒编号
        self.diamond = diamond  # 关联钻石实体
        self.ring_setting = ring_setting  # 关联戒托实体
        self.cert_id = cert_id  # 鉴定证书编号
 
    def __str__(self):
        """
 
        :return:
        """
        return (
            f"\n【定制钻戒成品信息】\n"
            f"钻戒编号:{self.ring_id}\n"
            f"配置:{self.diamond} + {self.ring_setting}\n"
            f"鉴定证书编号:{self.cert_id}"
        )
代码语言:javascript
复制
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:外观模式 Facade 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/7 13:10
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : DiamondPurchaseSystem.py
from FacadePattern.Diamond import Diamond
 
# ---------------------- 2. 定义4个核心子系统 ----------------------
class DiamondPurchaseSystem:
    """
    钻石采购子系统:按克拉、净度采购钻石,返回钻石实体
    """
    def purchase(self, carat: float, clarity: str) -> Diamond:
        """
        模拟采购逻辑(可扩展:供应商对接、质检等)
        :param carat:
        :param clarity:
        :return:
        """
        print(f"✅ 钻石采购完成:{carat}克拉,净度{clarity}")
        return Diamond(carat, clarity)
 
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:外观模式 Facade 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/7 13:11
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : RingSettingMakeSystem.py
from FacadePattern.RingSetting import RingSetting
 
# ---------------------- 2. 定义4个核心子系统 ----------------------
class RingSettingMakeSystem:
    """
    戒托制作子系统:按材质制作戒托,返回戒托实体
    """
    def make(self, material: str) -> RingSetting:
        """
        模拟制作逻辑(可扩展:尺寸定制、金价计算等)
        :param material:
        :return:
        """
        print(f"✅ 戒托制作完成:材质{material}")
        return RingSetting(material)
 
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:外观模式 Facade 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/7 13:13
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : DiamondInlaySystem.py
from FacadePattern.Diamond import Diamond
from FacadePattern.RingSetting import RingSetting
 
# ---------------------- 2. 定义4个核心子系统 ----------------------
class DiamondInlaySystem:
    """
    珠宝镶嵌子系统:将钻石镶嵌到戒托
    """
    def inlay(self, diamond: Diamond, ring_setting: RingSetting) -> None:
        """
        模拟镶嵌工艺(可扩展:镶嵌方式、质检等)
        :param diamond:
        :param ring_setting:
        :return:
        """
        print(f"✅ 镶嵌完成:{diamond} → {ring_setting}")
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:外观模式 Facade 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/7 13:14
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : CertificateSystem.py
 
# ---------------------- 2. 定义4个核心子系统 ----------------------
 
class CertificateSystem:
    """
    证书办理子系统:为成品钻戒办理鉴定证书,返回证书编号
    """
    def apply(self, ring_id: str) -> str:
        """
        模拟证书生成逻辑(可扩展:对接鉴定机构、信息录入等)
        :param ring_id:
        :return:
        """
        hash_str = str(hash(ring_id))  # 新增:将整数hash值转为字符串
        cert_id = f"CERT-{ring_id}-{hash_str[:6]}"  # 对字符串切片
        #cert_id = f"CERT-{ring_id}-{hash(ring_id)[:6]}"  # 简易证书编号规则
        print(f"✅ 证书办理完成:编号{cert_id}")
        return cert_id
代码语言:javascript
复制
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:外观模式 Facade 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/7 13:15
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : JewelryAdvisorFacade.py
from FacadePattern.DiamondInlaySystem import DiamondInlaySystem
from FacadePattern.CertificateSystem import CertificateSystem
from FacadePattern.RingSettingMakeSystem import RingSettingMakeSystem
from FacadePattern.DiamondPurchaseSystem import DiamondPurchaseSystem
from FacadePattern.DiamondRing import DiamondRing
 
 
# ---------------------- 3. 定义门面类(珠宝顾问) ----------------------
 
class JewelryAdvisorFacade:
    """
    珠宝顾问(门面类):封装4个子系统,提供统一定制接口
    """
    def __init__(self):
        """
        初始化所有子系统(门面类持有子系统引用)
        """
        self.diamond_sys = DiamondPurchaseSystem()
        self.ring_setting_sys = RingSettingMakeSystem()
        self.inlay_sys = DiamondInlaySystem()
        self.cert_sys = CertificateSystem()
 
    def customize_diamond_ring(self, ring_id: str, carat: float, clarity: str, material: str) -> DiamondRing:
        """
        定制钻戒的统一接口(客户端仅需调用此方法)
        :param ring_id: 钻戒唯一编号
        :param carat: 钻石克拉数
        :param clarity: 钻石净度
        :param material: 戒托材质
        :return: 成品钻戒实体
        """
        print("\n===== 开始定制钻戒 =====")
        # 1. 调用钻石采购子系统
        diamond = self.diamond_sys.purchase(carat, clarity)
        # 2. 调用戒托制作子系统
        ring_setting = self.ring_setting_sys.make(material)
        # 3. 调用珠宝镶嵌子系统
        self.inlay_sys.inlay(diamond, ring_setting)
        # 4. 调用证书办理子系统
        cert_id = self.cert_sys.apply(ring_id)
        # 组装成品钻戒实体并返回
        finished_ring = DiamondRing(ring_id, diamond, ring_setting, cert_id)
        print("===== 钻戒定制流程结束 =====\n")
        return finished_ring
代码语言:javascript
复制
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:外观模式 Facade 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/7 13:17
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : FacadeBll.py
from FacadePattern.JewelryAdvisorFacade import JewelryAdvisorFacade
 
# ---------------------- 4. 客户端调用(顾客) ----------------------
class FacadeBll(object):
    """
    外观模式 Facade Pattern
    """
    def demo(self):
        """
        外观模式 Facade Pattern
        客户端调用(顾客)
        :return:
        """
        # 顾客仅需接触门面类(珠宝顾问),无需关注4个子系统
        advisor = JewelryAdvisorFacade()
        # 调用统一接口,传入核心参数,完成定制
        my_diamond_ring = advisor.customize_diamond_ring(
            ring_id="ZR20260307001",
            carat=1.5,
            clarity="VVS1",
            material="铂金"
        )
        # 打印成品钻戒的完整属性
        print(my_diamond_ring)

调用:、

代码语言:javascript
复制
# 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 bll.CheckPatterns
 
 
def select_design_pattern() -> tuple[int, bll.CheckPatterns.DesignPattern | None]:
    """
    返回 (序列号, 选中的枚举对象),退出则返回 (0, None)
    :return:
    """
    print("\n=== 方式3:用户选择展示 ===")
    print("可选设计模式(输入0或q退出):")
    for idx, pattern in enumerate(bll.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(bll.CheckPatterns.DesignPattern):
                selected_pattern = list(bll.CheckPatterns.DesignPattern)[choice - 1]
                print(f"✅ 你选择了序号:{choice}(对应{selected_pattern._name_to_cn(selected_pattern.name)})")
                return (choice, selected_pattern)  # 返回(序列号, 枚举对象)
            else:
                print(f"❌ 输入无效!请输入1-{len(bll.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.')

输出:

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

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

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

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

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