观察者模式(Observer Pattern) 是一种行为设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式非常适合处理事件驱动系统,其中对象之间需要保持同步但又不想紧密耦合。
+------------------+ +-----------------------+
| Subject | | Observer |
|------------------| |-----------------------|
| - observers: List | | - update(message: String): void |
| - register(observer: Observer) | +-----------------------+
| - unregister(observer: Observer) | |
| - notifyObservers(message: String) | |
+------------------+ +-----------------------+
|
|
v
+---------------------------+
| ConcreteObserverA |
|--------------------------|
| - update(message: String) |
+---------------------------+
^
|
+---------------------------+
| ConcreteObserverB |
|--------------------------|
| - update(message: String) |
+---------------------------+
// 观察者接口
interface Observer {
void update(String message);
}
// 具体观察者A
class ConcreteObserverA implements Observer {
@Override
public void update(String message) {
System.out.println("ConcreteObserverA received: " + message);
}
}
// 具体观察者B
class ConcreteObserverB implements Observer {
@Override
public void update(String message) {
System.out.println("ConcreteObserverB received: " + message);
}
}
// 被观察者接口
interface Subject {
void register(Observer observer);
void unregister(Observer observer);
void notifyObservers(String message);
}
// 具体被观察者
class ConcreteSubject implements Subject {
private List observers = new ArrayList<>();
@Override
public void register(Observer observer) {
observers.add(observer);
}
@Override
public void unregister(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers(String message) {
for (Observer observer : observers) {
observer.update(message);
}
}
public void changeState() {
// 模拟状态变化
System.out.println("State changed, notifying observers...");
notifyObservers("State has been changed!");
}
}
// 客户端
public class Client {
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
Observer observerA = new ConcreteObserverA();
Observer observerB = new ConcreteObserverB();
subject.register(observerA);
subject.register(observerB);
subject.changeState();
subject.unregister(observerA);
subject.changeState();
}
}
#include
#include
#include
// 观察者接口
class Observer {
public:
virtual void update(const std::string& message) = 0;
virtual ~Observer() {}
};
// 具体观察者A
class ConcreteObserverA : public Observer {
public:
void update(const std::string& message) override {
std::cout << "ConcreteObserverA received: " << message << std::endl;
}
};
// 具体观察者B
class ConcreteObserverB : public Observer {
public:
void update(const std::string& message) override {
std::cout << "ConcreteObserverB received: " << message << std::endl;
}
};
// 被观察者接口
class Subject {
private:
std::vector observers;
public:
void registerObserver(Observer* observer) {
observers.push_back(observer);
}
void unregisterObserver(Observer* observer) {
observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end());
}
void notifyObservers(const std::string& message) {
for (Observer* observer : observers) {
observer->update(message);
}
}
void changeState() {
// 模拟状态变化
std::cout << "State changed, notifying observers..." << std::endl;
notifyObservers("State has been changed!");
}
};
// 客户端
int main() {
Subject subject;
Observer* observerA = new ConcreteObserverA();
Observer* observerB = new ConcreteObserverB();
subject.registerObserver(observerA);
subject.registerObserver(observerB);
subject.changeState();
subject.unregisterObserver(observerA);
subject.changeState();
delete observerA;
delete observerB;
return 0;
}
# 观察者接口
class Observer:
def update(self, message):
raise NotImplementedError
# 具体观察者A
class ConcreteObserverA(Observer):
def update(self, message):
print(f"ConcreteObserverA received: {message}")
# 具体观察者B
class ConcreteObserverB(Observer):
def update(self, message):
print(f"ConcreteObserverB received: {message}")
# 被观察者接口
class Subject:
def __init__(self):
self._observers = []
def register(self, observer):
self._observers.append(observer)
def unregister(self, observer):
self._observers.remove(observer)
def notify_observers(self, message):
for observer in self._observers:
observer.update(message)
def change_state(self):
# 模拟状态变化
print("State changed, notifying observers...")
self.notify_observers("State has been changed!")
# 客户端
if __name__ == "__main__":
subject = Subject()
observerA = ConcreteObserverA()
observerB = ConcreteObserverB()
subject.register(observerA)
subject.register(observerB)
subject.change_state()
subject.unregister(observerA)
subject.change_state()
package main
import (
"fmt"
)
// 观察者接口
type Observer interface {
update(message string)
}
// 具体观察者A
type ConcreteObserverA struct{}
func (c *ConcreteObserverA) update(message string) {
fmt.Printf("ConcreteObserverA received: %s\n", message)
}
// 具体观察者B
type ConcreteObserverB struct{}
func (c *ConcreteObserverB) update(message string) {
fmt.Printf("ConcreteObserverB received: %s\n", message)
}
// 被观察者接口
type Subject struct {
observers []Observer
}
func (s *Subject) register(observer Observer) {
s.observers = append(s.observers, observer)
}
func (s *Subject) unregister(observer Observer) {
for i, obs := range s.observers {
if obs == observer {
s.observers = append(s.observers[:i], s.observers[i+1:]...)
break
}
}
}
func (s *Subject) notifyObservers(message string) {
for _, observer := range s.observers {
observer.update(message)
}
}
func (s *Subject) changeState() {
// 模拟状态变化
fmt.Println("State changed, notifying observers...")
s.notifyObservers("State has been changed!")
}
// 客户端
func main() {
subject := &Subject{}
observerA := &ConcreteObserverA{}
observerB := &ConcreteObserverB{}
subject.register(observerA)
subject.register(observerB)
subject.changeState()
subject.unregister(observerA)
subject.changeState()
}
观察者模式 是一种行为设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式特别适用于事件驱动系统,其中对象之间需要保持同步但又不想紧密耦合。