设计模式-观察者模式

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

直接上代码

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

这里还加入了工厂模式。

所以理解了,随便用

原文地址:https://www.cnblogs.com/yanshw/p/10700129.html