[Python] 状态模式

当允许一个对象在其内部状态发生变化后改变它的行为,可以借助状态模式实现。

实现方法:

定义一个抽象状态类,添加对应的methods(行为),让不同的状态继承自这个抽象状态类,同时重写对应的methods(行为),这样就构建了不同的状态。
接下来让状态的主体与状态间构成组合关系,即状态是主体的一部分,利用self.state = State()实现,同时,将主体与状态进行关联,以达到执行不同状态行为的能力。

UML类图

在这里插入图片描述

简单代码

# TODO: 抽象的状态类
class State:
    # 获取状态的名称
    def getName(self):
        pass

    # 不同状态下的不同行为
    def behavior(self):
        pass

class SolidState(State):
    def getName(self):
        return "Solid"

    def behavior(self):
        print("水变成了固态")

class LiquidState(State):
    def getName(self):
        return "Liquid"

    def behavior(self):
        print("水变成了液态")


class GaseousState(State):
    def getName(self):
        return "Liquid"

    def behavior(self):
        print("水变成了气态")


class Water:
    def __init__(self):
        self.__temperature = 25
        self.__state = LiquidState()

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

    def setState(self):
        if self.__temperature >=100:
            self.__state = GaseousState()
        elif self.__temperature>=0:
            self.__state = LiquidState()
        else:
            self.__state = SolidState()

    # 下面的是针对这个例子添加的methods
    def getTemperature(self):
        return self.__temperature

    def increaseTemperature(self, step):
        self.__temperature += step
        self.setState()
        self.behavior()

    def decreaseTempearature(self, step):
        self.__temperature -= step
        self.setState()
        self.behavior()

if __name__ == '__main__':
    waterIns = Water()
    waterIns.increaseTemperature(78)
    waterIns.decreaseTempearature(120)

上面的代码实际上并不好,这里不做说明了。
看了网上的对状态模式的代码,有一个地方觉得挺有意思,就是状态切换的实现,是放到子状态中实现,即子状态中定义setState()方法(接下来的代码),还是放到主体类的methods中(上面的代码),两种情况都有出现过。

class State(object):
13     def __init__(self):
14         pass
15 
16     def write_program(self, w):
17         pass
18 
19 class Work(object):
20 
21     def __init__(self):
22         self.hour = 9
23         self.curr = ForenoonState()
24 
25     def set_state(self, s):
26         self.curr = s
27 
28     def write_program(self):
29         self.curr.write_program(self)
30 
31 
32 class ForenoonState(State):
33 
34     def write_program(self, w):
35         if w.hour < 12:
36             print "当前时间:%s点,"%w.hour,"精神百倍"
37         else:
38             w.set_state(AfternoonState())
39             w.write_program()
40 
41 class AfternoonState(State):
42 
43     def write_program(self, w):
44         if w.hour < 17:
45             print "当前时间:%s点,"%w.hour,"状态还行,继续努力"
46         else:
47             w.set_state(EveningState())
48             w.write_program()
49 
50 class EveningState(State):
51 
52     def write_program(self, w):
53         if w.hour < 21:
54             print "当前时间:%s点,"%w.hour,"加班呢,疲劳了"
55         else:
56             w.set_state(SleepState())
57             w.write_program()
58 
59 
60 class SleepState(State):
61 
62     def write_program(self, w):
63         print "当前时间:%s点,"%w.hour,"不行了,睡着了"
64 
65 if __name__=="__main__":
66     work = Work()
67     work.hour = 9
68     work.write_program()
69     work.hour = 15
70     work.write_program()
71     work.hour = 20
72     work.write_program()
73     work.hour = 22
74     work.write_program()

按照前面的UML图,我更倾向将状态切换的method放到主体类中。

完善一下

具体怎么完善,人人都懂设计模式中有,后续补充

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值