观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在这种模式中,我们可以将被观察者称为主题(Subject),观察者称为订阅者(Observer)。主题负责维护观察者的列表,并在状态发生变化时通知它们。订阅者则需要实现一个update()方法,用于接收主题的通知并作出相应的处理。通过这种方式,我们可以实现松耦合的设计,使得系统更加灵活和可扩展。
在软件开发中,我们经常需要处理一些对象之间的依赖关系,一个对象的状态发生变化,需要通知其他依赖它的对象进行相应的处理,这时,观察者模式就派上用场了,观察者模式是一种行为设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
观察者模式的核心概念包括:
1、主题(Subject):主题是需要被观察的对象,它维护了一个观察者列表,用于存储所有注册的观察者,主题可以添加、删除观察者,也可以通知所有观察者有新的事件发生。
2、观察者(Observer):观察者是一个需要接收通知的对象,它实现了主题接口中的某个方法(如update),用于处理主题通知过来的事件,当主题状态发生变化时,会遍历观察者列表,调用每个观察者的update方法。
3、具体观察者(ConcreteObserver):具体观察者是观察者接口的实现类,它实现了update方法,用于处理具体的事件,当主题状态发生变化时,会通知所有已注册的具体观察者。
4、抽象观察者(AbstractObserver):抽象观察者是观察者接口的抽象类,它定义了一个update方法的模板,具体的观察者需要实现这个模板,当主题状态发生变化时,会通知所有已注册的具体观察者。
下面我们通过一个简单的例子来说明如何使用观察者模式:
假设我们有一个在线聊天系统,用户可以发送消息给其他用户,当一个用户发送消息时,需要通知其他在线的用户,这时,我们可以使用观察者模式来实现这个功能。
1、我们需要定义一个主题接口:ChatSubject,包含以下方法:
- registerObserver(observer: Observer):注册观察者;
- unregisterObserver(observer: Observer):注销观察者;
- notifyObservers():通知所有已注册的观察者。
2、我们需要定义一个具体观察者接口:ChatObserver,包含以下方法:
- update(message: String):处理接收到的消息。
3、我们需要实现ChatSubject和ChatObserver接口:
from abc import ABC, abstractmethod class ChatSubject(ABC): def __init__(self): self.observers = [] def registerObserver(self, observer): self.observers.append(observer) def unregisterObserver(self, observer): self.observers.remove(observer) def notifyObservers(self, message: str): for observer in self.observers: observer.update(message) class ChatObserver(ABC): @abstractmethod def update(self, message: str): pass
4、我们可以创建具体的观察者类和主题类来实现在线聊天系统的功能:
class User(ChatObserver): def update(self, message: str): print(f"{self.__class__.__name__} received a message: {message}") class Server(ChatSubject): def __init__(self): super().__init__() def sendMessageToAllUsers(self, message: str): print(f"Server sent a message to all users: {message}") self.notifyObservers(message) 测试代码 server = Server() user1 = User() user2 = User() user3 = User() user4 = User() user5 = User() user6 = User() user7 = User() user8 = User() user9 = User() user10 = User() user11 = User() user12 = User() user13 = User() user14 = User() user15 = User() user16 = User() user17 = User() user18 = User() user19 = User() user20 = User() user21 = User() user22 = User() user23 = User() user24 = User() user25 = User() user26 = User() // ... (共26个用户) + user26 = User() // ... (共26个用户) + user26 = User() // ... (共26个用户) + user26 = User() // ... (共26个用户) + user26 = User() // ... (共26个用户) + user26 = User() // ... (共26个用户) + user26 = User() // ... (共26个用户) + user26 = User() // ... (共26个用户) + user26 = User() // ... (共26个用户) + user26 = User() // ... (共26个用户) + user26 = User() // ... (共26个用户) + user26 = User() // ... (共26个用户) + user26 = User() // ... (共26个用户) + user26 = User() // ... (共26个用户) + user26 = User() // ... (共26个用户) + user26 = User() // ... (共26个用户) + user27 = User() // ... (共27个用户) + user28 = User() // ... (共28个用户) + user29 = User() // ... (共29个用户) + user30 = User() // ... (共30个用户) + user31 = User() // ... (共31个用户) + user32 = User() // ... (共32个用户) + user33 = User() // ... (共33个用户) + user34 = User() // ... (共34个用户) + user35 = User() // ... (共35个用户) + user36 = User() // ... (共36个用户) + user37 = User() // ... (共37个用户) + user38 = User() // ... (共38个User()) + user39 = ChatObserver(),// ... (共40个User()) + user40 = ChatObserver(),// ... (共41个User()) + user41 = ChatObserver(),// ... (共42个User()) + user42 = ChatObserver(),// ... (共43个User()) + user43 = ChatObserver(),// ... (共44个User()) + user44 = ChatObserver(),// ... (共45个User()) + user45 = ChatObserver(),// ... (共46个User()) + user46 = ChatObserver(),// ... (共47个User()) + user47 = ChatObserver(),// ... (共48个User()) + user48 = ChatObserver(),// ... (共49个User()) + user49 = ChatObserver(),// ... (共50个User()) + user50 = ChatObserver(),// ... (共51个User()) + user51 = ChatObserver(),// ... (共52个User()) + user52 = ChatObserver(),// ... (共53个User()) + user53 = ChatObserver(),// ... (共54个User()) + user54 = ChatObserver(),// ... (共55个User()) + user55 = ChatObserver(),// ... (共56个User()) + user56 = ChatObserver(),// ... (共57个User()) + user57 = ChatObserver(),// ... (共58个User()) + user58 = ChatObserver(),// ... (共59个User()) + user59 = ChatObserver(),// ... (共60个User()) + user60 = ChatObserver(),// ... (共61个User()) + user61 = ChatObserver(),// ... (共62个User()) + user62 = ChatObserver(),// ... (共63个User()) + user63