
# encoding: utf-8
# 版权所有 2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# 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:47
# User : geovindu
# Product : PyCharm
# Project : pydesginpattern
# File : CheckPatterns.py
'''
创建型模式 Creational Patterns
抽象工厂Abstract Factory
生成器Builder
工厂方法Factory Method
原型Prototype
单例Singleton
结构型模式 Structural Patterns
适配器Adapter
桥接Bridge
组合Composite
装饰Decorator
外观Facade
享元Flyweight
代理Proxy
行为模式 Behavioral Patterns
责任链Chain of Responsibility
迭代器Iterator
备忘录Memento
状态State
模板方法Template Method
命令Command
中介者Mediator
观察者Observer
策略Strategy
访问者Visitor
'''
from enum import Enum, auto # 导入枚举相关模块
import bll.MementoBll
import bll.CommandBll
import bll.StateBll
import bll.TemplateMethodBll
import bll.VisitorBll
import bll.StrategyBll
import bll.ObserveBll
import bll.MediatorBll
import bll.IteratorBll
import bll.ChainofResponsibilityBll
import bll.ProxyBll
# ====================== 枚举类定义:管理所有设计模式示例 ======================
class DesignPattern(Enum):
"""
设计模式枚举 - 每个枚举成员对应一个设计模式的示例函数
"""
Memento = auto()
"""
备忘录模式
"""
Command = auto() #
"""
命令模式
"""
State = auto() #
"""
状态模式
"""
TemplateMethod=auto() #
"""
模板方法模式
"""
Visitor=auto() #
"""
访问者模式
"""
Strategy=auto() #
"""
策略模式
"""
Observe=auto() #
"""
观察者模式
"""
Mediator=auto() #
"""
中介者模式
"""
Iterator=auto() #
"""
迭代器模式
"""
ChainofResponsibility=auto() #
"""
责任链模式
"""
Proxy=auto() #
"""
代理模式
"""
Flyweight=auto()
"""
享元模式
"""
def show_example(self):
"""
枚举成员方法:根据当前枚举值执行对应的示例函数
:return:
"""
pattern_handlers = {
DesignPattern.Memento:lambda:(bll.MementoBll.MementoBll().demo()),
DesignPattern.Command:lambda:(bll.CommandBll.CommandBll().demo()),
DesignPattern.State:lambda:(bll.StateBll.StateBll().demo()),
DesignPattern.TemplateMethod:lambda:(bll.TemplateMethodBll.TemplateMethodBll().demo()),
DesignPattern.Visitor:lambda:(bll.VisitorBll.VisitorBll().demo()),
DesignPattern.Strategy:lambda:(bll.StrategyBll.StrategyBll().demo()),
DesignPattern.Observe:lambda:(bll.ObserveBll.ObserveBll().demo()),
DesignPattern.Mediator:lambda:(bll.MediatorBll.MediatorBll().demo()),
DesignPattern.Iterator:lambda:(bll.IteratorBll.IteratorBll().demo()),
DesignPattern.ChainofResponsibility:lambda:(bll.ChainofResponsibilityBll.ChainofResponsibilityBll().dudemo()),
DesignPattern.Proxy:lambda:(bll.ProxyBll.ProxyBll().demo()),
}
# 获取当前枚举对应的示例函数并执行
handler = pattern_handlers.get(self)
if handler:
print(f"\n===== 展示【{self.name}({self._name_to_cn(self.name)})】示例 =====")
handler()
else:
print(f"❌ 暂未实现{self.name}的示例")
@staticmethod
def _name_to_cn(name: str) -> str:
"""
枚举名称转中文,提升可读性
:param name:
:return:
"""
cn_map = {
"Memento": "备忘录模式",
"Command": "单例模式",
"State": "命令模式",
"TemplateMethod": "模板方法模式",
"Visitor": "模板方法模式",
"Strategy": "策略模式",
"Observe": "观察者模式",
"Mediator": "中介者模式",
"Iterator": "迭代器模式",
"ChainofResponsibility": "责任链模式 ",
"Proxy": "代理模式",
"Flyweight": "享元模式",
}
return cn_map.get(name, name)调用:
# 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.')输出:
