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