概述
建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应。在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系,可以根据需要增加和删除观察者,使得系统更易于扩展。
定义
定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(
Publish/Subscribe
)模式、模型-视图(Model/View
)模式、源-监听器(Source/Listener
)模式或从属者(Dependents
)模式
角色
Subject
: 目标ConcreteSubject
: 具体目标Observer
: 观察者ConcreteObserver
: 具体观察者
场景
- when an abstraction has two aspects, one dependent on the other
- when a change to one object requires changing others, and you don't know how many objects need to be changed
- when an object should be able to notify other objects without making assumptions about who these objects are
实现
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 70 71 72 73 74 |
class Subject; //抽象观察者 class Observer { public: virtual ~Observer() {} virtual int GetState() = 0; virtual void update(Subject * subject) = 0; //... }; //具体观察者 class ConcreteObserver : public Observer { public: ConcreteObserver(const int state):observer_state(state) {} ~ConcreteObserver() {} int GetState() { return observer_state; } void update(Subject * subject) { observer_state = subject->GetState(); std::cout << "Observer state updated" << std::endl; } private: int observer_state; //... }; //抽象目标 class Subject { public: virtual ~Subject() {} void attach(Observer * observer) { observers.push_back(observer); } void detach(const int index) { observers.erase(observers.begin() + index); } void notify() { for (size_t i = 0; i < observers.size(); i++) observers.at(i)->update(this); } virtual int GetState() = 0; virtual void SetState(const int state) = 0; private: std::vector<Observer*> observers; }; //具体目标 class ConcreteSubject : public Subject { public: ~ConcreteSubject() {} int GetState() { return subject_state; } void SetState(const int state) { subject_state = state; } private: int subject_state; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
auto main()->int { ConcreteObserver observer1(1); ConcreteObserver observer2(2); std::cout << "observer 1 state is " << observer1.GetState() << std::endl; std::cout << "observer 2 state is " << observer2.GetState() << std::endl; Subject * subject = new ConcreteSubject(); subject->attach(&observer1); subject->attach(&observer2); subject->SetState(10); subject->notify(); std::cout << "observer 1 state is " << observer1.GetState() << std::endl; std::cout << "observer 2 state is " << observer2.GetState() << std::endl; return 0; } |
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 架构模式:MVVM模式07/27
- ♥ 结构型:适配器模式09/19
- ♥ 行为型:解释器模式09/25
- ♥ 创建型:工厂方法模式08/25
- ♥ 结构型:外观模式09/24
- ♥ 架构模式:MVP模式07/28