最近在看设计模式,其中观察者模式描述为:
场景:在游戏中主角在行走的过程中摄像机镜头总是跟随着他使他总是处于场景的中心;主角往往有随从,这些随从会根据主角的行为作出相应的配合行为和动作。意图:对象之间存在某种依赖关系,当一个对象的状态发生改变的时候,所有依赖它的对象都得通知并作出相应的反应。观察者模式又叫做发表-订阅模式=模型-视图模式=源-收听者模式=从属者模式。动机:将一个系统分解成相互协作的类有一种常见的副作用是需要维护多个对象之间的一致性,在上述应用场景中我们需要维护的是摄像机对英雄位置的依赖、随从对英雄的依赖、信息窗口对选中对象的依赖等等。解决方案:只要在主角对象中加入摄像机对象和随从对象的引用即可。但是我们不希望为了维护一致性而使系统紧密耦合,从而降低对象的可重用性。观察者模式描述了如何建立这种依赖关系,此模式关键在于两个角色,即目标和观察者,一个目标可以有任意数目的依赖于它的观察者,一旦目标的状态发生变化,所有的观察者就会得到通知,作为对这个通知的响应,每个观察者都将查询目标以使其状态与目标保持同步。
用Python代码实现:
#观察者
class Xiaoming():
def save(self):
print('小明:我来救你了!')
def com(self):
print('小明:我来陪你!')
#观察者
class Xiaogang():
def save(self):
print('小刚:你走开让我来救她!')
def com(self):
print('小刚:你走开让我来陪她!')
#被观察者
class Xiaohong():
xiaoming=Xiaoming
xiaogang=Xiaogang
def __init__(self,xiaomingobj,xiaogangobj):
self.xiaoming=xiaomingobj
self.xiaogang=xiaogangobj
def call_help(self):
print('小红:救命啊!')
self.xiaoming.save()
self.xiaogang.save()
def call_com(self):
print('小红:谁陪我逛街?')
self.xiaoming.com()
self.xiaogang.com()
#接口
class Run():
xiaohong=Xiaohong
def __init__(self,xiaohongobj):
self.xiaohong=xiaohongobj
def runhelp (self):
self.xiaohong.call_help()
def runcom (self):
self.xiaohong.call_com()
#测试
if __name__== '__main__':
m=Xiaoming()
g=Xiaogang()
h=Xiaohong(m,g)
run=Run(h)
run.runhelp()
print('-------')
run.runcom()
运行结果是:
小红:救命啊!
小明:我来救你了!
小刚:你走开让我来救她!
-------
小红:谁陪我逛街?
小明:我来陪你!
小刚:你走开让我来陪她!
>>>
为了扩展性更强,应该尽量多的使用继承:可将所有观察者抽象成观察者类而非单独的观察者个体类。