Python设计模式-状态模式

状态模式可以看作是在运行时改变对象行为的一种方式。

欢迎关注我的公众号:zx94_11
假设有一台笔记本电脑,它有以下几个状态:

  • 开机「On」
  • 关机「Off」
  • 挂起「Suspend」
  • 休眠「Hibernate」

封装对象行为的接口

首先需要一个行为与对象状态关联的接口

它有两个属性:

  • 状态
  • 允许的状态

它有一个方法:

  • 切换状态

切换状态的时候会使用self.__class__将它动态切换到状态对应的对象,这个稍后再看。

class ComputerState(object):
    name = "状态"
    allowed = []

    def switch(self, state):
        if state.name in self.allowed:
            print(f"状态由「{self}」切换到新的状态「{state.name}」。")
            self.__class__ = state
        else:
            print(f"状态由「{self}」切换到新的状态{state.name}是不可能的。")

    def __str__(self):
        return self.name

定义几种状态

  • name对应当前类的状态
  • allowed对应当前状态支持的转换状态
class Off(ComputerState):
    name = '关闭'
    allowed = ['打开']


class On(ComputerState):
    name = '打开'
    allowed = ['关闭', '休眠', '挂起']


class Suspemd(ComputerState):
    name = '挂起'
    allowed = ['打开']


class Hibernate(ComputerState):
    name = '休眠'
    allowed = ['打开']

定义一个计算机

class Computer(object):
    def __init__(self):
        self.state = Off()

    def change(self, state):
        self.state.switch(state)

一个计算机的初始状态就是关机状态咯,所以实例化的时候把Off() 赋给self.state

测试

if __name__ == '__main__':
    computer = Computer()
    computer.change(On)
    computer.change(Off)
    computer.change(On)
    computer.change(Suspemd)
    computer.change(Hibernate)
    computer.change(On)
    computer.change(Off)

实例化一下之后,

  • 开机
  • 关机
  • 开机
  • 挂起
  • 休眠
  • 开机
  • 关机
运行结果

self.__class__

可以通过调试模式来进行学习

将断点创建在self.__class__ = state这一行上

可以看到等号左侧是Off,右侧是On,这样就完成了状态的切换。

状态1
状态2

优缺点

优点

  • 取消了if/else条件逻辑的依赖
  • 方便添加状态来支持额外的行为
  • 提高聚合性
  • 非常容易的添加行为,提高了代码的灵活性,提高了代码的可维护性

缺点:

  • 类太多了,
  • 新行为引入,其他子类都需相应的处理该新行为。这样使得上下文更容易受到每个新的行为的影响。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容