zoukankan      html  css  js  c++  java
  • 设计模式-观察者模式

    如果你理解了,它可以用于各种场景,如果你不理解,什么场景也用不了,所以重点在于理解,尝试去用。

    直接上代码

    # 例如:一个个奸细同时在监视小明,在他的身上安装的定位
    class Person(object):
        # 被监视者
        def __init__(self):
            self._observerlist = []     # 核心是记录观察者id
    
        def attach(self, observer):
            #被偷偷安装监视器
            self._observerlist.append(observer)
    
        def detach(self, observer):
            #去除监视器
            self._observerlist.remove(observer)
    
        def notify(self, location):
            for obs in self._observerlist:
                obs.update(location)            # 调用观察者的方法
    
    class Observer(object):                    # 观察者
        def update(self, message):
            print("get infomation: ",message)
    
    
    if __name__ == "__main__":
        observer = Observer()               # 来了一个监视人员
    
        xiaoming = Person()                 # 被监视者小明童鞋
        xiaoming.attach(observer)           # 观察者注册,小明被监视
        xiaoming.notify("go to beijing")    # 小明准备去北京,被监视者刺探到情报

    一个东西被一堆东西围着,这种场景很多,都可以用观察者模式,如注册,监听等

    观察者模式又叫发布-订阅模式

    class Publisher:
        # 发布者
        def __init__(self):
            pass
    
        def register(self):
            pass
    
        def unregister(self):
            pass
    
        def notifyAll(self):
            pass
    
    class TechForum(Publisher):     # 被观察对象
        def __init__(self):
            self._listOfUsers = []
            self.postname = None
    
        def register(self, userObj):
            if userObj not in self._listOfUsers:
                    self._listOfUsers.append(userObj)
    
        def unregister(self, userObj):
            self._listOfUsers.remove(userObj)
    
        def notifyAll(self):
            for objects in self._listOfUsers:
                objects.notify(self.postname)
    
        def writeNewPost(self , postname):      # 被观察者通知观察者额外的信息
            self.postname = postname
            self.notifyAll()
    
    
    class Subscriber:
        def __init__(self):
            pass
    
        def notify(self):
            pass
    
    
    class User1(Subscriber):        # 观察者1
        def notify(self, postname):
            print"User1 notified of a new post %s" % postname
    
    
    class User2(Subscriber):        # 观察者2
        def notify(self, postname):
            print"User2 notified of a new post %s" % postname
    
    
    class SisterSites(Subscriber):
        def __init__(self):
            self._sisterWebsites = ["Site1" , "Site2", "Site3"]
    
        def notify(self, postname):
            for site in self._sisterWebsites:
                    print"Send nofication to site:%s " % site
    
    
    
    if __name__ == "__main__":
        techForum = TechForum() # 被观察对象
    
        user1 = User1()     # 监视者1号
        user2 = User2()     # 监视者2号
        sites = SisterSites()   # 监视者头目
    
        techForum.register(user1)   # 被3人监视
        techForum.register(user2)
        techForum.register(sites)
    
        techForum.writeNewPost("Observe Pattern in Python")     # 放烟雾弹
        #
        techForum.unregister(user2)     # 干掉2号
        techForum.writeNewPost("MVC Pattern in Python")

    这里还加入了工厂模式。

    所以理解了,随便用

  • 相关阅读:
    西卡编程教学 C语言教学视频(共32课更新完毕) 『 西卡教学 』 西卡学院 Powered by Pureing Labs!
    大图片新闻的体验还是不错的
    分享:用php抓取网页内容方法总结
    “深圳文献港”昨日正式开通_综合新闻_财经_腾讯网
    分享:EJDB 1.0.37 发布,嵌入式 JSON 数据库引擎
    分享:MetaModel 3.2.5 发布,数据库元模型
    RQ: Simple job queues for Python
    分享:开源主机项目 Ouya 发布 SDK
    RQ 简单的任务队列 品牌控
    信息论、推理与学习算法(翻译版)
  • 原文地址:https://www.cnblogs.com/yanshw/p/10700129.html
Copyright © 2011-2022 走看看