<Design Mode all understand> - state model

Also water, solid, gaseous, liquid state change, caused by temperature.

This is the lead state thinking mode.

from ABC Import ABCMeta, AbstractMethod
 # introduction ABCMeta and AbstractMethod defining abstract classes and abstract methods 

"" " 
Version 1.0 
class Water: 

    DEF the __init __ (Self, State): 
        Self .__ temperature = 25 
        Self .__ State = State 

    DEF set_state (Self, State ): 
        Self .__ State = State 

    DEF change_state (Self, State): 
        IF Self .__ State: 
            . Print ( "changed by the {} {}" the format (Self .__ state.get_name (), state.get_name ())) 

        the else : 
            Print ( "initialized} {" the format (state.get_name ()).) 
        Self .__ State = State 

    DEF get_temperature (Self): 
        return temperature Self .__

    def set_temperature(self, temperature):
        self.__temperature = temperature
        if self.__temperature <= 0:
            self.change_state(SolidState("固态"))
        elif self.__temperature <= 100:
            self.change_state(LiquidState("液态"))
        else:
            self.change_state(GaseousState("气态"))

    def rise_temperature(self, step):
        self.set_temperature(self.__temperature + step)

    def reduce_temperature(self, step):
        self.set_temperature(self.__temperature - step)

    def behavior(self):
        self.__state.behavior(self)


class State:

    def __init__(self, name):
        self.__name = name

    def get_name(self):
        return self.__name

    @abstractmethod
    def behavior(self, water):
        pass


class SolidState(State):
    def __init__(self, name):
        super().__init__(name)

    def behavior(self, water):
        print("当前体温: {}".format(str(water.get_temperature())))


class LiquidState(State):
    def __init__(self, name):
        super().__init__(name)

    def behavior(self, water):
        print("当前体温: {}".format(str(water.get_temperature())))


class GaseousState(State):
    def __init__(self, name):
        super().__init__(name)

    def behavior(self, water):
        print("当前体温: {}".format(str(water.get_temperature())))


def test_state():
    water = Water(LiquidState("液态"))
    water.behavior()
    water.set_temperature(-4)
    water.behavior()
    water.rise_temperature(18)
    water.behavior()
    water.rise_temperature(110)
    water.behavior()

test_state()
"""


# version 2.0
class Context(metaclass=ABCMeta):

    def __init__(self):
        self.__states = []
        self.__cur_state = None
        self.__state_info = 0

    def add_state(self, state):
        if state not in self.__states:
            self.__states.append(state)

    def change_state(self, state):
        if state is None:
            return False
        if self.__cur_state is None:
            print("初始化为: {}".format(state.get_name()))
        else:
            print("由 {} 变为 {}".format(self.__cur_state.get_name(), state.get_name()))
        self.__cur_state = state
        self.add_state(state)
        return True

    def get_state(self):
        return self.__cur_state

    def _set_state_info(self, state_info):
        self.__state_info = state_info
        for state in self.__states:
            if state.is_match(state_info):
                self.change_state(state)

    def _get_state_info(self):
        return self.__state_info


class State:
    def __init__(self, name):
        self.__name = name

    def get_name(self):
        return self.__name

    def is_match(self, state_info):
        return False

    @abstractmethod
    def behavior(self, context):
        pass


class Water(Context):

    def __init__(self):
        super().__init__()
        self.add_state(SolidState("固态"))
        self.add_state(LiquidState("液态"))
        self.add_state(GaseousState("气态"))
        self.set_temperature(25)

    def get_temperature(self):
        return self._get_state_info()

    def set_temperature(self, temperature):
        self._set_state_info(temperature)

    def rise_temperature(self, step):
        self.set_temperature(self.get_temperature() + step)

    def reduce_temperature(self, step):
        self.set_temperature(self.get_temperature() - step)

    def behavior(self):
        state = self.get_state()
        if isinstance(state, State):
            state.behavior(self)


def singleton(cls, *args, **kwargs):
    instance = {}

    def __singletone(*args, **kwargs):
        if cls not in instance:
            instance[cls] = cls(*args, **kwargs)
        return instance[cls]

    return __singletone


@singleton
class SolidState(State):
    def __init__(self, name):
        Super (). __init__ (name) 

    DEF is_match (Self, state, state_info of):
        return state, state_info of < 0 

    DEF behavior (Self, context):
         Print ( " , my character cold high current temperature: {} " .format (context._get_state_info () )) 


@Singleton 
class LiquidState (State):
     DEF  the __init__ (Self, name): 
        . Super () the __init__ (name) 

    DEF is_match (Self, state, state_info of):
         return 0 <= state, state_info of <100 DEF behavior (Self, context):
         Print ( " I have a warm personality, current temperature: {}

     " .format (context ._get_state_info ())) 


@Singleton 
class GaseousState (State):
    def __init__(self, name):
        super().__init__(name)

    def is_match(self, state_info):
        return state_info >= 100

    def behavior(self, context):
        print("我性格热烈,当前体温: {}".format(context._get_state_info()))


def test_state():
    water = Water()
    water.behavior()
    water.set_temperature(-4)
    water.behavior()
    water.rise_temperature(18)
    water.behavior()
    water.rise_temperature(110)
    water.behavior()

test_state()
C: \ Python36 \ python.exe C: / the Users / Sahara / PycharmProjects / the Test / python_search.py 
initialized: Liquid 
my gentle personality, current temperature: 25 
from a liquid to a solid state 
, high cold my personality, current temperature: - 4 
from solid to liquid 
me gentle disposition, current temperature: 14 
from a liquid to gaseous 
my warm personality, current temperature: 124 

Process Finished with Exit code 0

 

Guess you like

Origin www.cnblogs.com/aguncn/p/11331685.html