当前位置: 移动技术网 > IT编程>脚本编程>Python > Python笔记:状态设计模式

Python笔记:状态设计模式

2019年12月18日  | 移动技术网IT编程  | 我要评论

海伦教育网,完蛋了惹上恶魔王子,win10镜像

状态模式可以看做是在运行时改变对象行为的一种方式。状态模式允许对象在其内部状态变化时改变其行为,此时感觉就像对象本身已经改变了一样。

参与者:

  • state接口:state基类,定义不同状态共同需要执行的接口。
  • concretesate对象:state基类的子类,不同状态的可以在子类接口中实现不同的操作。
  • context对象:客户端需要关注的对象,此对象中维护自身的具体状态对象,当状态改变时,改变的是context中的状态对象,而context对象是不需要改变的。

优点:

  • 对象的行为是根据运行时对象的状态而定,避免了使用大量的条件判断来改变代码逻辑。
  • 状态模式中,更加容易添加新的行为,只需要定义一个额外的状态即可。
  • 提高了编码的聚合性,使得属于同种状态的操作被归于一个类中。

缺点:

  • 由于状态本身的功能过于单一,可能会创建过多的状态类,导致使用和维护都会变得非常麻烦。
  • 对于context对象,每个状态的引入,都可能需要进行更新,并且每次更新都可能会影响到原来的行为,导致context对象的维护变得更加困难。

简单示例:

"""
以电饭煲为例,它有三种状态或者说三种功能:煮饭、煮汤、煮粥
指定好电饭煲的状态后,它就开始以对应模式进行工作
"""
from abc import abcmeta, abstractmethod


class cookstate(metaclass=abcmeta):
    """state接口:定义状态对象共有的接口,即需要煮什么"""
    @abstractmethod
    def cook(self):
        pass


class cookrice(cookstate):
    """concretesate对象:煮饭"""
    def cook(self):
        print('cooking rice...')


class cooksoup(cookstate):
    """concretesate对象:煮汤"""
    def cook(self):
        print('cooking soup...')


class cookporridge(cookstate):
    """concretesate对象:煮粥"""
    def cook(self):
        print('cooking porridge...')


class cooker:
    """context对象:电饭煲,根据自身状态决定煮什么"""
    def __init__(self):
        # 定义本身具有的几种状态,或者电饭煲的几种功能
        self.states = [cookrice(), cooksoup(), cookporridge()]
        self.state_index = 0

    def switch_state(self):
        """切换电饭煲的状态"""
        if self.state_index == (len(self.states) - 1):
            self.state_index = 0
        else:
            self.state_index += 1

    def start_cook(self):
        """开始工作"""
        self.states[self.state_index].cook()


if __name__ == '__main__':
    cooker = cooker()
    cooker.start_cook()
    cooker.switch_state()
    cooker.start_cook()

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网