<人人都懂设计模式>-状态模式

2023-05-11,,

同样是水,固态,气态,液态的变化,是由温度引起。

引此为思考状态模式

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 

<人人都懂设计模式>-状态模式的相关教程结束。

《<人人都懂设计模式>-状态模式.doc》

下载本文的Word格式文档,以方便收藏与打印。