在编程中,我们经常遇到需要在对象之间传递信息的情况,这时,我们可以使用观察者模式来实现,观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有依赖者都会收到通知并自动更新。
观察者模式主要包括两个角色:主题(Subject)和观察者(Observer),主题是一个具体的类,它维护了一系列的观察者对象,并在状态发生变化时通知它们,观察者是一个接口或抽象类,它定义了一个更新方法,当接收到主题的通知时,会调用这个方法来更新自己的状态。
1. 单一职责原则(SRP):每个角色都应该只有一个职责,即只负责处理某一方面的问题,在观察者模式中,主题负责管理观察者对象,而观察者只负责处理状态更新。
2. 开放封闭原则(OCP):软件实体(类、模块、函数等等)应该可以扩展,但是不可修改,在观察者模式中,如果需要添加新的观察者对象,只需要实现Observer接口即可;而不需要修改主题类的代码。
3. 里氏替换原则(LSP):子类型必须能够替换掉它们的基类型,在观察者模式中,如果一个新的观察者类继承自现有的Observer类,那么它就可以替换掉原来的Observer类。
为了更好地理解观察者模式,我们来看一个简单的例子,假设我们有一个新闻发布系统,新闻发布者是主题对象,而订阅新闻的人则是观察者对象,当新闻发布者发布了一条新新闻时,所有订阅了这条新闻的观察者都会收到通知并更新自己的界面。
首先我们需要定义一个新闻类(News),它包含一个字符串类型的标题和内容:
class News: def __init__(self, title, content): self.title = title self.content = content
接下来我们需要定义一个观察者接口(Observer),它包含一个更新方法(update):
from abc import ABC, abstractmethod class Observer(ABC): @abstractmethod def update(self, news): pass
然后我们需要定义几个具体的观察者类(ConcreteObserver),它们实现了Observer接口并提供了自己的更新方法:
class EmailObserver(Observer): def update(self, news): print("通过邮件接收到新闻:", news.title) class WebsiteObserver(Observer): def update(self, news): print("在网站上显示新闻:", news.title)
最后我们需要定义一个主题类(Subject),它维护了一个观察者列表,并提供了添加和删除观察者的方法以及通知所有观察者的方法: