Python笔记:状态设计模式

状态模式能够看作是在运行时改变对象行为的一种方式。状态模式容许对象在其内部状态变化时改变其行为,此时感受就像对象自己已经改变了同样。编码

参与者:spa

  • State接口:State基类,定义不一样状态共同须要执行的接口。
  • ConcreteSate对象:State基类的子类,不一样状态的能够在子类接口中实现不一样的操做。
  • Context对象:客户端须要关注的对象,此对象中维护自身的具体状态对象,当状态改变时,改变的是Context中的状态对象,而Context对象是不须要改变的。

优势:code

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

缺点:对象

  • 因为状态自己的功能过于单一,可能会建立过多的状态类,致使使用和维护都会变得很是麻烦。
  • 对于Context对象,每一个状态的引入,均可能须要进行更新,而且每次更新均可能会影响到原来的行为,致使Context对象的维护变得更加困难。

简单示例:blog

"""
以电饭煲为例,它有三种状态或者说三种功能:煮饭、煮汤、煮粥
指定好电饭煲的状态后,它就开始以对应模式进行工做
"""
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()
相关文章
相关标签/搜索