python: State Pattern

代码实现思路

  1. 状态基类:定义所有珠宝状态都必须实现的核心行为(描述、加工)。
  2. 具体状态类:为每个珠宝状态(原石、粗加工、精加工、成品)实现专属的行为逻辑,并处理状态切换。
  3. 上下文类(珠宝):持有当前状态的引用,对外提供统一的操作接口,将具体行为委托给当前状态对象执行.
python 复制代码
# encoding: utf-8
# 版权所有 2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:状态模式 State Pattern
# 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/19 9:02
# User      : geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : JewelState.py
# explain   : 学习
 
from abc import ABC, abstractmethod
 
# ---------------------- 1. 状态基类 ----------------------
class JewelState(ABC):
    """
    珠宝状态的抽象基类,定义所有状态必须实现的方法
    """
    def __init__(self, jewel):
        # 持有上下文(珠宝)的引用,用于状态切换
        self.jewel = jewel
 
    @abstractmethod
    def describe(self):
        """
        描述当前状态的珠宝
        """
        pass
 
    @abstractmethod
    def process(self):
        """
        执行加工操作(不同状态下加工行为不同)
        """
        pass
python 复制代码
# encoding: utf-8
# 版权所有 2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:状态模式 State Pattern
# 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/19 9:03
# User      : geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : RawState.py
# explain   : 学习
 
 
from StatePattern.JewelState import JewelState
from StatePattern.RoughProcessedState import RoughProcessedState
 
 
# ---------------------- 2. 具体状态类 ----------------------
class RawState(JewelState):
    """
    原石状态:未经过任何加工
    """
    def describe(self):
        """
 
        """
 
        return f"【{self.jewel.name}】- 原石状态:表面粗糙,无光泽,仅能看到基础材质。"
 
    def process(self):
        """
 
        """
        # 原石只能粗加工,加工后切换到粗加工状态
        print(f"正在对{self.jewel.name}进行粗加工...")
        self.jewel.set_state(RoughProcessedState(self.jewel))
        return f"{self.jewel.name}完成粗加工,进入粗加工状态!"
 
 
 
# encoding: utf-8
# 版权所有 2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:状态模式 State Pattern
# 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/19 9:05
# User      : geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : FineProcessedState.py
# explain   : 学习
from StatePattern.JewelState import JewelState
from StatePattern.FinishedState import FinishedState
 
 
# ---------------------- 2. 具体状态类 ----------------------
 
class FineProcessedState(JewelState):
    """
    精加工状态:打磨抛光,细节完善
    """
    def describe(self):
        """
 
        """
        return f"【{self.jewel.name}】- 精加工状态:表面抛光,形状规整,已有明显光泽。"
 
    def process(self):
        """
 
        """
        # 精加工后可做成成品,加工后切换到成品状态
        print(f"正在将{self.jewel.name}制作成成品...")
        self.jewel.set_state(FinishedState(self.jewel))
        return f"{self.jewel.name}完成成品制作,进入成品状态!"
 
# encoding: utf-8
# 版权所有 2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:状态模式 State Pattern
# 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/19 9:06
# User      : geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : FinishedState.py
# explain   : 学习
 
from StatePattern.JewelState import JewelState
 
 
 
# ---------------------- 2. 具体状态类 ----------------------
class FinishedState(JewelState):
    """
    粗加工状态:去除杂质,初步塑形
    """
    def describe(self):
        """
 
        """
        return f"【{self.jewel.name}】- 成品状态:工艺完整,光泽饱满,可直接售卖/佩戴!"
 
    def process(self):
        """
 
        """
        # 成品无法再加工,返回提示
        return f"⚠️ {self.jewel.name}已是成品,无需再加工!"
 
 
# encoding: utf-8
# 版权所有 2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:状态模式 State Pattern
# 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/19 9:04
# User      : geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : RoughProcessedState.py
# explain   : 学习
 
from StatePattern.JewelState import JewelState
from StatePattern.FineProcessedState import FineProcessedState
 
# ---------------------- 2. 具体状态类 ----------------------
 
class RoughProcessedState(JewelState):
    """
    粗加工状态:去除杂质,初步塑形
    """
    def describe(self):
        """
 
        """
        return f"【{self.jewel.name}】- 粗加工状态:已去除杂质,有基础形状,但细节粗糙。"
 
    def process(self):
        """
 
        """
        # 粗加工后可精加工,加工后切换到精加工状态
        print(f"正在对{self.jewel.name}进行精加工...")
        self.jewel.set_state(FineProcessedState(self.jewel))
        return f"{self.jewel.name}完成精加工,进入精加工状态!"
python 复制代码
# encoding: utf-8
# 版权所有 2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:状态模式 State Pattern
# 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/19 9:09
# User      : geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : Jewel.py
# explain   : 学习
from StatePattern.RawState import RawState
 
 
# ---------------------- 3. 上下文类(珠宝) ----------------------
class Jewel:
    """
    珠宝类(上下文):持有当前状态,对外提供统一操作接口
    """
    def __init__(self, name):
        """
 
        """
        self.name = name
        # 初始状态为原石
        self._state = RawState(self)
 
    def set_state(self, state):
        """
        切换珠宝状态(核心:状态由具体状态类触发,上下文仅接收)
        """
        self._state = state
 
    def describe(self):
        """
        委托给当前状态的describe方法
        """
        return self._state.describe()
 
    def process(self):
        """
        委托给当前状态的process方法
        """
        return self._state.process()
python 复制代码
# encoding: utf-8
# 版权所有 2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:状态模式 State Pattern
# 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/19 9:11
# User      : geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : StateBll.py
# explain   : 学习
 
from StatePattern.Jewel import Jewel
 
class StateBll(object):
    """
 
    """
 
    def demo(self):
        """
 
        """
        # 创建一个钻石珠宝实例
        diamond = Jewel("钻石")
 
        # 初始状态:原石
        print(diamond.describe())
        # 执行加工:原石→粗加工
        print(diamond.process())
        print("-" * 50)
 
        # 当前状态:粗加工
        print(diamond.describe())
        # 执行加工:粗加工→精加工
        print(diamond.process())
        print("-" * 50)
 
        # 当前状态:精加工
        print(diamond.describe())
        # 执行加工:精加工→成品
        print(diamond.process())
        print("-" * 50)
 
        # 当前状态:成品
        print(diamond.describe())
        # 尝试加工成品(无效果)
        print(diamond.process())

调用:

python 复制代码
# 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.MementoBll import MementoBll
from bll.CommandBll import CommandBll
from bll.StateBll import StateBll
 
if __name__ == '__main__':
 
    #实现备忘录模式(Memento Pattern)
    #mementobll= MementoBll()
    #mementobll.demo()
    #命令模式(Command Pattern)
    #commandBll= CommandBll()
    #commandBll.demo()
    # 状态模式 State Pattern
    stateBll =StateBll()
    stateBll.demo()
    print('PyCharm')

输出:

相关推荐
kishu_iOS&AI5 小时前
深度学习 —— 损失函数
人工智能·pytorch·python·深度学习·线性回归
好运的阿财5 小时前
OpenClaw工具拆解之canvas+message
人工智能·python·ai编程·openclaw·openclaw工具
wengqidaifeng5 小时前
python启航:1.基础语法知识
开发语言·python
观北海5 小时前
Windows 平台 Python 极简 ORB-SLAM3 Demo,从零实现实时视觉定位
开发语言·python·动态规划
FreakStudio5 小时前
做了个Claude Code CLI 电子宠物:程序员的实体监工代码搭子
python·单片机·嵌入式·面向对象·并行计算·电子diy·电子计算机
柴米油盐那点事儿5 小时前
python+mysql+bootstrap条件搜索分页
python·mysql·flask·bootstrap
AC赳赳老秦6 小时前
OpenClaw二次开发实战:编写专属办公自动化技能,适配个性化需求
linux·javascript·人工智能·python·django·测试用例·openclaw
Ulyanov7 小时前
《PySide6 GUI开发指南:QML核心与实践》 第二篇:QML语法精要——构建声明式UI的基础
java·开发语言·javascript·python·ui·gui·雷达电子对抗系统仿真
刀法如飞7 小时前
一款Python语言Django框架DDD脚手架,助你快速搭建项目
python·ddd·脚手架
刀法如飞7 小时前
一款Python语言Django框架DDD脚手架,适合中大型项目
后端·python·领域驱动设计