...

Python设计模式-12-观察者模式

观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它会自动通知所有观察者对象,使它们能够及时更新自己的状态。观察者模式通常包括以下几个角色:

  • 主题(Subject):定义了被观察的对象,可以有多个观察者监听它。

  • 观察者(Observer):定义了接收主题通知的接口,每个观察者都可以根据主题的通知来更新自己的状态。

  • 具体主题(Concrete Subject):实现了主题接口,可以添加、删除和通知观察者。

  • 具体观察者(Concrete Observer):实现了观察者接口,可以接收主题的通知并更新自己的状态。

下面是一个简单的 Python 示例,演示了如何使用观察者模式:

class Subject:
    def __init__(self):
        self.observers = []

    def attach(self, observer):
        self.observers.append(observer)

    def detach(self, observer):
        self.observers.remove(observer)

    def notify(self):
        for observer in self.observers:
            observer.update(self)

class ConcreteSubject(Subject):
    def __init__(self):
        super().__init__()
        self.state = None

    def get_state(self):
        return self.state

    def set_state(self, state):
        self.state = state
        self.notify()

class Observer:
    def update(self, subject):
        pass

class ConcreteObserverA(Observer):
    def update(self, subject):
        print(f'ConcreteObserverA: Subject state is {subject.get_state()}.')

class ConcreteObserverB(Observer):
    def update(self, subject):
        print(f'ConcreteObserverB: Subject state is {subject.get_state()}.')

subject = ConcreteSubject()

observer_a = ConcreteObserverA()
subject.attach(observer_a)

observer_b = ConcreteObserverB()
subject.attach(observer_b)

subject.set_state('state1')
subject.set_state('state2')

subject.detach(observer_a)

subject.set_state('state3')

在上面的示例中,我们定义了一个主题 Subject,它定义了被观察的对象,并可以添加、删除和通知观察者。然后,我们定义了一个具体主题 ConcreteSubject,它实现了主题接口,并包含一个状态。在 set_state() 方法中,我们首先更新状态,然后调用 notify() 方法通知所有观察者。接下来,我们定义了一个观察者 Observer,它定义了接收主题通知的接口。然后,我们定义了两个具体观察者 ConcreteObserverA 和 ConcreteObserverB,它们实现了观察者接口,并可以接收主题的通知并更新自己的状态。

在使用观察者模式时,我们可以通过创建一个主题和多个观察者来实现一对多的依赖关系。在上面的示例中,我们创建了一个具体主题 ConcreteSubject 和两个具体观察者 ConcreteObserverA 和 ConcreteObserverB,并将它们组合在一起。当主题的状态发生变化时,它会自动通知所有观察者,并让它们能够及时更新自己的状态。需要注意的是,观察者模式可以帮助我们实现一对多的依赖关系,但也可能会导致系统的复杂性增加。

posted @ 2023-06-16 18:34  韩志超  阅读(121)  评论(0编辑  收藏  举报