Design Patterns - État

1 h Niveau 10

Il fournit un module pour les machines à état, qui sont mises en œuvre en utilisant des sous-classes, dérivées d'une classe de machine à état spécifiée. Les méthodes sont indépendantes de l'état et provoquent des transitions déclarées à l'aide de décorateurs.

Comment mettre en œuvre le modèle d'état ?

L'implémentation de base du modèle d'état est présentée ci-dessous :

class ComputerState(object):

    name = "state"
    allowed = []

    def switch(self, state):
        """ Switch to new state """
        if state.name in self.allowed:
            print('Current:', self, '=> switched to new state', state.name)
            self.__class__ = state
        else:
            print('Current:', self, '=> switching to' ,state.name, 'not possible')

    def __str__(self):
        return self.name

class Off(ComputerState):
    name = "off"
    allowed = ['on']

class On(ComputerState):
    """ State of being powered on and working """
    name = "on"
    allowed = ['off','suspend','hibernate']

class Suspend(ComputerState):
    """ State of being in suspended mode after switched on """
    name = "suspend"
    allowed = ['on']

class Hibernate(ComputerState):
    """ State of being in hibernation after powered on """
    name = "hibernate"
    allowed = ['on']

class Computer(object):
    """ A class representing a computer """

    def __init__(self, model='HP'):
        self.model = model
        # State of the computer - default is off.
        self.state = Off()

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

if __name__ == "__main__":
    comp = Computer()
    comp.change(On)
    comp.change(Off)
    comp.change(On)
    comp.change(Suspend)
    comp.change(Hibernate)
    comp.change(On)
    comp.change(Off)

Résultat

Le programme ci-dessus génère le résultat suivant :

Current: off => switched to new sate on
Current: on => switched to new sate off
Current: off => switched to new sate on
Current: on => switched to new sate suspend
Current: suspend => switching to hibernate not possible
Current: suspend => switched to new sate on
Current: on => switched to new sate off
logo discord

Besoin d'aide ?

Rejoignez notre communauté officielle et ne restez plus seul à bloquer sur un problème !

En savoir plus