您的当前位置:首页[Python设计模式] 10 - 观察者模式

[Python设计模式] 10 - 观察者模式

2024-12-14 来源:哗拓教育

设计模式的目的是让代码易维护、易扩展,不能为了模式而模式,因此一个简单的工具脚本是不需要用到任何模式的。

观察者模式:又叫发布订阅模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时,会通知所有观察者对象,是他们能自动更新自己。

代码结构

class Topic(object):
    """主题类。保存所有观察者实例的引用,每个主题都可以有很多观察者
    可以增加和删除观察者"""
    def __init__(self):
        self.obs = []

    def Attach(self, ob):
        self.obs.append(ob)

    def Detach(self, ob):
        self.obs.remove(ob)

    def Notify(self):
        for ob in self.obs:
            ob.Update()

class Observer(object):
    """抽象观察者类,收到主题的变更通知时,更新自己"""
    def Update(self):
        raise NotImplementedError()      

class ConcreteTopic(object):
    """一个具体主题"""
    def __init__(self):
        self.state = None

    def ChangeState(self, newState):
        self.state = newState
        self.Notify()

class ConcreteObserver(object):
    """一个具体监听类"""
    def __init__(self, topic):
        self.topic = topic

    def Update(self):
        print self.topic.state

def client():
    topic = ConcreteTopic()
    topic.Attach(ConcreteObserver(topic))

    topic.ChangeState('New State')

众多MQ中间件都是采用这种模式的思想来实现的。

观察者模式可以让主题和观察者之间解耦,互相之间尽可能少的依赖。不过抽象主题和抽象观察者之间还是有耦合的。

显示全文