python允许在运行时打“热补丁”,也就是替换掉类的函数。这让状态模式的实现变的简单。 下面是一个权限验证的鬼畜例子,由于类对象的内部发生了状态变化,所以你没办法知道对象最终是什么状态。所以这个对象是一次性的。不能重复使用。
代码语言:javascript复制import types
class Role(object):
def __init__(self):
self.check = types.MethodType(check_admin, self)
def check_admin(self, power):
if power > 10:
print("is admin")
else:
# 开始发生状态转换
self.check = types.MethodType(check_user, self)
self.check(power)
def check_user(self, power):
if 0 < power <= 10:
print("is user")
else:
self.check = types.MethodType(check_block, self)
self.check(power)
def check_block(self, power):
print("is block")
def check(power):
obj = Role()
obj.check(power)
check(5)
更好的做法应该是,让用户来决定对象的状态,这会让程序变的明确。