• 设计模式-观察者模式


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

    直接上代码

    # 例如:一个个奸细同时在监视小明,在他的身上安装的定位
    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")

    这里还加入了工厂模式。

    所以理解了,随便用

  • 相关阅读:
    微服务架构中的熔断 VS 股票市场中的熔断
    通过异常处理错误
    Java之GC 如何工作
    HBase学习笔记
    日志打印的正确姿势
    告别if/else连环写法
    下载resource下的excel文件
    get请求和post请求参数中文乱码的解决办法
    jquery基础
    45度炸队Alpha冲刺博客集
  • 原文地址:https://www.cnblogs.com/yanshw/p/10700129.html
Copyright © 2020-2023  润新知