状态模式

# -*- coding: utf-8 -*-
### 状态模式:
"""
    - 定义:
        当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类
    - 优点:
        1. 状态模式下,结构清晰,相比于 if...else更简洁
        2. 封装性好,外部结构不必知道内部细节
        3. 应用场景:行为状态改变的场景. 在各种控制器中非常常见 或 逻辑结构为状态转移图的场景
    - 缺点:
        1. 在状态较多时,子类不便管理
"""


class LiftState:
    """
        # 电梯状态
    """

    def open(self):
        pass

    def close(self):
        pass

    def run(self):
        pass

    def stop(self):
        pass


class OpenState(LiftState):

    def open(self):
        print('Open:门已开启!')
        return self

    def close(self):
        print('Open:开始关门!')
        print('Open:已经关门')
        return StopState()

    def run(self):
        print('Open: 禁止运行!')
        return self

    def stop(self):
        print('Open: 禁止停止!')
        return self


class RunState(LiftState):
    def open(self):
        print('RUN:禁止开门!')
        return self

    def close(self):
        print('RUN:禁止关闭')
        return self

    def run(self):
        print('RUN:电梯正在运行')
        return self

    def stop(self):
        print('RUN:即将停止!')
        print('RUN:已经停止!')
        return StopState()


class StopState(LiftState):
    def open(self):
        print('Stop:门即将打开')
        print('Stop:门已打开')
        return OpenState()

    def close(self):
        print('Stop:禁止关门!')
        return self

    def run(self):
        print('Stop:电梯开始运行!')
        return RunState()

    def stop(self):
        print('Stop: 电梯已经停止')
        return self


class Context():
    lift_state = ''

    def getState(self):
        """
            # 获取状态
        :return:
        """
        return self.lift_state

    def setState(self, lift_state):
        """
            # 设置 电梯状态
        :param lift_state:
        :return:
        """
        self.lift_state = lift_state

    def open(self):
        """
            # 开门
        :return:
        """
        self.setState(self.lift_state.open())

    def close(self):
        """
            # 关门
        :return:
        """
        self.setState(self.lift_state.close())

    def run(self):
        """
            # 运行
        :return:
        """
        self.setState(self.lift_state.run())

    def stop(self):
        """
            # 停止
        :return:
        """
        self.setState(self.lift_state.stop())


if __name__ == '__main__':
    ctx = Context()
    ctx.setState(StopState())
    ctx.open()
    ctx.run()
    ctx.close()
    ctx.run()
    ctx.stop()


posted @   染指未来  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示