行为型设计模式-观察者模式

2024-05-14

行为型设计模式-观察者模式示例记录

1. 背景

通过示例(C++)加强对设计模式的体感。

2. 23种设计模式简要说明

23种设计模式

这里说明观察者模式

3. 观察者模式(Observer Pattern)

观察者模式(Observer Pattern) 是一种行为设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。

这个主题对象在状态发生变化时,会通知所有依赖它的观察者对象,使它们能够自动更新自己。

角色:

  • 主题(Subject):定义了被观察的对象,它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者。
  • 观察者(Observer):为那些在主题发生改变时需要获得通知的对象定义一个更新接口。这个接口使得主题能够知道观察者的哪一个方法应该被调用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <iostream>  
#include <list>  
#include <memory>  
  
// Observer 接口  
class Observer {  
public:  
    virtual ~Observer() = default;  
    virtual void update(const std::string& message) = 0;  
};  
  
// ConcreteObserver 类,实现了 Observer 接口  
class ConcreteObserver : public Observer {  
private:  
    std::string name;  
  
public:  
    ConcreteObserver(const std::string& name) : name(name) {}  
  
    void update(const std::string& message) override {  
        std::cout << name << " received: " << message << std::endl;  
    }  
};  
  
// Subject 类  
class Subject {  
private:  
    std::list<std::shared_ptr<Observer>> observers;  
  
public:  
    void attach(std::shared_ptr<Observer> observer) {  
        observers.push_back(observer);  
    }  
  
    void detach(std::shared_ptr<Observer> observer) {  
        observers.remove(observer);  
    }  
  
    void notify(const std::string& message) {  
        for (const auto& observer : observers) {  
            observer->update(message);  
        }  
    }  
  
    // 假设的状态改变方法  
    void changeState(const std::string& newState) {  
        std::cout << "Subject state changed to: " << newState << std::endl;  
        notify("State changed to " + newState);  
    }  
};  
  
int main() {  
    Subject subject;  
  
    std::shared_ptr<Observer> observer1 = std::make_shared<ConcreteObserver>("Observer 1");  
    std::shared_ptr<Observer> observer2 = std::make_shared<ConcreteObserver>("Observer 2");  
  
    subject.attach(observer1);  
    subject.attach(observer2);  
  
    subject.changeState("New State"); // 这将触发通知  
  
    // 如果我们不再需要某个观察者,可以注销它  
    subject.detach(observer1);  
  
    subject.changeState("Another New State"); // 这将只通知 observer2  
  
    return 0;  
}

g++ observer.cpp -std=c++11 -o observer

4. 小结

1、通过示例介绍了观察者模式

5. 参考

1、GPT



Comments