sunrise

每天不断学习,才能不断提升自己。

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  64 随笔 :: 0 文章 :: 92 评论 :: 0 Trackbacks

参见:http://baike.baidu.com/view/1854779.htm
http://blog.csdn.net/huangkangying/article/details/7901602
实现观察者模式的过程
实现观察者模式有很多形式,比较直观的一种是使用一种“注册——通知——撤销注册”的形式。下面的三个图详细的描述了这样一种过程:
1、观察者  (Observer)将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器(Container)里。
2、被观察对象  被观察对象发生了某种变化(如图中的SomeChange),从容器中得到所有注册过的观察者,将变化通知观察者。
3、撤销观察  观察者告诉被观察者要撤销观察,被观察者从容器中将观察者去除。
  观察者将自己注册到被观察者的容器中时,被观察者不应该过问观察者的具体类型,而是应该使用观察者的接口。这样的优点是:假定程序中还有别的观察者,那么只要这个观察者也是相同的接口实现即可。一个被观察者可以对应多个观察者,当被观察者发生变化的时候,他可以将消息一一通知给所有的观察者。基于接口,而不是具体的实现——这一点为程序提供了更大的灵活性。

#coding:utf8

class Observer(object):
    
"""

     观察者类

    
"""
    
def __init__(self,subject):
        
#设定一个主题
        self.subject = subject
        
#向这个主题添加这个观察者
        self.subject.addObserver(self)

        
#观察者持有数据
        self.fansnum = self.subject.fansnum

    
def update(self,fansnum):
        self.fansnum 
= fansnum
        self.display()

    
def display(self):
        
print self.fansnum
        
    
class Subject(object):
    
"""

    主题类

    
"""

    
def __init__(self):

        
#观察者列表
        self.observerList = []
        self.fansnum 
= 0

    
#增加观察者
    def addObserver(self,observer):
        self.observerList.append(observer)

    
#删除观察者
    def deleteObserver(self,observer):
        
if observer in self.observerList:
            self.observerList.remove(observer)

    
#通知观察者进行更新
    def notifyObservers(self):
        
for observer in self.observerList:
            observer.update(self.fansnum)

    
#当值改变时通知观察者
    def setValue(self,fansnum):
        self.fansnum 
= fansnum
        
#通知观察者
        self.notifyObservers()


if __name__ == '__main__':
    subject 
= Subject()
    observer 
= Observer(subject)
    observer.display()
    subject.setValue(
2)
    subject.setValue(
3)

 

【观察者模式的优点和缺点】
观察者模式的优点:
1、观察者和主题之间的耦合度较小;
2、支持广播通信;

观察者模式的缺点:
1、由于观察者并不知道其它观察者的存在,它可能对改变目标的最终代价一无所知。这可能会引起意外的更新。

【观察者模式适用场景】
1、当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。
2、当对一个对象的改变需要同时改变其它对象,而不知道具体有多少个对象待改变。
3、当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换句话说,你不希望这些对象是紧密耦合的。


 

posted on 2013-01-08 16:45 SunRise_at 阅读(1616) 评论(0)  编辑 收藏 引用 所属分类: 设计模式

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理