【程序设计】Python的状态模式

状态模式的定义如下:当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类。

优点:
1、状态模式的优点是结构清晰,相比于if…else…简约了不少;
2、封装性好,外部调用不必知道内部实现细节。


应用场景:
1、行为状态改变的场景。这点在各种控制器中非常常见,同时,逻辑结构为状态转移图的场景中都非常适用。

缺点
1、在状态比较多时,子类也会非常多,不便于管理。

流程图:



python代码实现:

"""

State 状态模式

电梯的控制逻辑,即使简单点设计,把状态分成开门状态,停止状态和运行状态,
操作分成开门、关门、运行、停止,那流程也是很复杂的。
首先,
开门状态不能开门、运行、停止;
停止状态不能关门,停止;
运行状态不能开门、关门、运行。
"""


# 实现抽象的状态类
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 ("打开:门开了……")
        return self
    def close(self):
        print ("打开:门开始关上……")
        print ("打开:门关上了")
        return StopState()
    def run(self):
        print ("打开:禁止运行。")
        return self
    def stop(self):
        print ("打开:停止被禁止的。")
        return self
class RunState(LiftState):
    def open(self):
        print ("运行:禁止打开。")
        return self
    def close(self):
        print ("运行:被禁止的。")
        return self
    def run(self):
        print ("运行:电梯正在运行…")
        return self
    def stop(self):
        print ("运行:电梯开始停止……")
        print ("运行:电梯停了下来…")
        return StopState()
class StopState(LiftState):
    def open(self):
        print ("停止:门是开的…")
        print ("停止:门开了…….")
        return OpenState()
    def close(self):
        print ("停止:关闭禁止")
        return self
    def run(self):
        print ("停止:电梯开始运行……")
        return RunState()
    def stop(self):
        print ("停止:电梯停止。")
        return self


# 将上下文进行记录
class Context:
    lift_state=""
    def getState(self):
        return self.lift_state
    def setState(self,lift_state):
        self.lift_state=lift_state
    def open(self):
        self.setState(self.lift_state.open())
    def close(self):
        self.setState(self.lift_state.close())
    def run(self):
        self.setState(self.lift_state.run())
    def stop(self):
        self.setState(self.lift_state.stop())

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




原文:https://yq.aliyun.com/articles/71198?spm=a2c4e.11153940.blogcont280715.30.175692aawkXRdB

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值