观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。 观察者模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。,,在观察者模式中,有三个角色:主题(Subject)、观察者(Observer)和具体观察者(ConcreteObserver)。主题是一个对象,它维护了一系列的观察者,并且可以向这些观察者发送消息。当主题的状态发生改变时,它会通知所有的观察者。具体观察者是一个实现了抽象观察者接口的具体类。
本文目录导读:
在软件开发中,设计模式是一种被广泛接受并经过验证的解决方案,用于解决特定问题,它们提供了一种可重用的、结构化的解决方案,可以帮助开发者更高效地编写代码,本文将重点介绍一种非常实用的设计模式——观察者模式(Observer Pattern)。
观察者模式是一种行为型设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新,这种模式主要用于实现解耦和事件驱动,使得系统更加灵活、可扩展和易于维护。
观察者模式的基本概念
1、主题(Subject):定义了添加、删除和通知观察者的方法,主题是一个具体的类,它维护了一个观察者列表,并在状态发生改变时通知这些观察者。
2、观察者(Observer):定义了一个更新方法,用于在主题状态发生改变时接收通知并执行相应的操作,观察者可以是任何具有该方法的对象,例如自定义的类或接口。
3、注册(Registration):在主题中添加观察者的过程,当一个观察者被添加到主题时,主题会将其引用保存在一个内部的数据结构中。
4、注销(Deregistration):从主题中移除观察者的过程,当一个观察者不再需要接收通知时,它应该从主题中被移除。
5、通知(Notification):主题在状态发生改变时调用观察者的更新方法,将通知传递给它们。
观察者模式的优点
1、解耦:通过将状态变化的通知与具体的行为分离,实现了代码的模块化和可重用性,当需要修改某个部分的行为时,只需修改相关的类,而无需修改其他依赖于此部分的代码。
2、事件驱动:观察者模式实现了一种事件驱动的架构,使得系统中的各个组件可以像处理事件一样处理状态变化,这样可以降低系统的复杂性,提高可维护性。
3、灵活性:观察者模式允许在运行时动态地添加或删除观察者,这使得系统可以更容易地适应需求的变化,观察者模式也支持多个观察者对同一主题进行订阅,以实现更高级的通信机制。
观察者模式的实现示例
下面我们使用Python语言来实现一个简单的观察者模式示例:
from abc import ABC, abstractmethod 抽象主题类 class Subject(ABC): def __init__(self): self._observers = [] def attach(self, observer): if observer not in self._observers: self._observers.append(observer) def detach(self, observer): try: self._observers.remove(observer) except ValueError: pass @abstractmethod def notify(self): pass 具体主题类:新闻发布系统 class NewsPublisher(Subject): def __init__(self): super().__init__() self.__state = None @property def state(self): return self.__state @state.setter def state(self, value): self.__state = value self.notify() def notify(self): for observer in self._observers: observer.update(self.__state) 具体观察者类:新闻订阅者A class NewsSubscriberA(Subject): def __init__(self, name): super().__init__() self.__name = name self.__news = None @property def news(self): return self.__news @news.setter def news(self, value): self.__news = value print(f"{self.__name} received news: '{value}'") 具体观察者类:新闻订阅者B class NewsSubscriberB(NewsSubscriberA): _subscriptions = set() _unsubscriptions = set() _updates = [] _names = [] _current_state = None _is_active = False _lock = None _cond = None _notifier = None; _cond = threading.Condition(); _notifier = threading.Thread(target=NewsSubscriberB._run); _notifier.start(); _lock = threading.Lock(); _cond = threading.Condition() # define the class variables here (e.g. self._subscriptions) # implement the methods here (e.g. update()) # use the class here (e.g. create an instance and call its methods) # example usage: subscriber = NewsSubscriberB("Subscriber B") publisher = NewsPublisher() publisher.attach(subscriber) publisher.state = "New state" ```