最近在看设计模式,其中状态模式描述为:
状态模式:背景:游戏程序总体上看处于若干种状态,过场动画、游戏主菜单、游戏主画面、脚本控制等。游戏在不同的状态中表现出相当不同的行为。从更加微观的角度看,一个主角往往处于若干个状态中,闲逛、追击、打斗、逃跑等。意图:允许一个对象在其内部内部状态改变时改变它的行为。对象看起来似乎改变了它的类。别名:状态对象。动机:希望一个对象根据自身的状态而改变行为,但是又避免使用冗长的条件语句。传统解决方案:在环境对象中声明一个枚举型的变量,代表环境对象所处的状态,在环境对象中的行为方法中,根据枚举变量的值,使用条件语句描述在不同状态下独享的不同行为。面向对象的状态模式的解决方案:一个对象的行为取决于它的状态,并且该分支依赖于对象的状态,这个状态通常用枚举常量来表示,通常在这个对象的多个操作中包含这一个相同的条件约束。状态模式将每一个条件分支放在一个独立的类中。
代码实现:
#抽象的状态接口,基类
class State():
def happy(self):
pass
def sad(self):
pass
#继承于状态接口的具体状态类
class State_normal(State):
def happy(self):
print('状态一正常:开心,笑。')
def sad(self):
print('状态一正常:不开心,哭。')
class State_freak(State):
def happy(self):
print('状态二不正常:开心,哭哭。')
def sad (self):
print('状态二不正常:不开心,笑笑。')
#环境对象
class Environment():
state=State
def set_state(self,state_obj):
self.state=state_obj
#给环境设置不同的状态,在这个不同的状态下,调用同样一种方法。
#但是得到的响应是不同的,就好像改变了类一样。
def porform(self):
self.state.happy()
self.state.sad()
#测试
if __name__ =='__main__':
e=Environment()
select_state=State_normal()
e.set_state(select_state)
e.porform()
print('-------------')
select_state=State_freak()
e.set_state(select_state)
e.porform()
运行结果:
状态一正常:开心,笑。
状态一正常:不开心,哭。
-------------
状态二不正常:开心,哭哭。
状态二不正常:不开心,笑笑。
这里的妙处在于将不同状态下的方法分给状态类而不是分给接口类实现。