跳转至

状态 State

🐉 状态

在状态模式中,对象的行为是基于它的内部状态而改变的。 这个模式允许某个类对象在运行时发生改变。

示例:

#!/usr/bin/env python
# encoding: utf-8
"""
状态模式
当一个对象的内在状态改变时, 允许改变其行为. 这个对象看起来更像是改变了其类
- 解决: 当控制一个对象状态转换的条件表达式过于复杂的情况,
        把状态的判断逻辑转移到表示不同状态的一系列类中, 可以把复杂的判断逻辑简单化
- 好处: 将与特定状态相关的行为局部化, 并且将不同状态的行为分割开来
- 通过定义新的子类, 可以很容易地增加新的状态和转换
- 消除庞大的条件分支语句, 减少相互间的依赖, 把各种状态转移逻辑分布到了State的子类之间
- 适用: 当一个对象的行为取决于它的状态, 并且它必需在运行时刻根据状态改变其行为时, 使用状态模式
"""

from abc import ABCMeta, abstractmethod


class State(metaclass=ABCMeta):
    """
    抽象状态类, 定义一个接口以封装与Context的一个特定状态相关的行为
    """

    @abstractmethod
    def handle(self, context):
        pass


class ConcreteStateA(State):
    def handle(self, context):
        """
        设定下一个状态是
        """
        context.state = ConcreteStateB()


class ConcreteStateB(State):
    def handle(self, context):
        """
        设定下一个状态是
        """
        context.state = ConcreteStateA()


class Context(object):
    """
    维护一个ConcreteState子类的实例, 这个实例定义当前的状态
    """

    def __init__(self, state):
        self.__state = state

    @property
    def state(self):
        return self.__state

    @state.setter
    def state(self, value):
        print("current status:", value.__class__.__name__)
        self.__state = value

    def request(self):
        self.__state.handle(self)

if __name__ == '__main__':
    c = Context(ConcreteStateA())

    c.request()
    c.request()
    c.request()
    c.request()