同样是水,固态,气态,液态的变化,是由温度引起。
from abc import ABCMeta, abstractmethod # 引入ABCMeta和abstractmethod来定义抽象类和抽象方法 """ version 1.0 class Water: def __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("由 {} 变为 {}".format(self.__state.get_name(), state.get_name())) else: print("初始化为{}".format(state.get_name())) self.__state = state def get_temperature(self): return self.__temperature 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_info): return state_info < 0 def behavior(self, context): print(", 我性格高冷, 当前体温: {}".format(context._get_state_info())) @singleton class LiquidState(State): def __init__(self, name): super().__init__(name) def is_match(self, state_info): return 0 <= state_info < 100 def behavior(self, context): print("我性格温和, 当前体温: {}".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:/Users/Sahara/PycharmProjects/test/python_search.py 初始化为: 液态 我性格温和, 当前体温: 由 液态 变为 固态 , 我性格高冷, 当前体温: - 由 固态 变为 液态 我性格温和, 当前体温: 由 液态 变为 气态 我性格热烈,当前体温: Process finished with exit code