你去珠宝店定制钻戒,不需要自己去对接钻石采购、戒托制作、珠宝鉴定、证书办理等多个部门(子系统),只需要告诉珠宝顾问(门面)你的需求,顾问会帮你协调所有环节,你只需要最终取货即可。
我们模拟珠宝店定制钻戒的场景,涉及 4 个子系统:
钻石采购子系统:根据参数(克拉、净度)采购钻石
戒托制作子系统:根据材质(铂金 / 18K 金)制作戒托
珠宝镶嵌子系统:将钻石镶嵌到戒托上
证书办理子系统:为成品钻戒办理鉴定证书
# 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.pyfrom FacadePattern.Diamond import Diamondfrom 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}" )
# 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.pyfrom 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.pyfrom 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.pyfrom FacadePattern.Diamond import Diamondfrom 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
# 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.pyfrom FacadePattern.DiamondInlaySystem import DiamondInlaySystemfrom FacadePattern.CertificateSystem import CertificateSystemfrom FacadePattern.RingSettingMakeSystem import RingSettingMakeSystemfrom FacadePattern.DiamondPurchaseSystem import DiamondPurchaseSystemfrom 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
# 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.pyfrom 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)
调用:
# 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.CheckPatternsdef 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.')
输出: