观察者模式
1.何为观察者模式
观察者模式定义了一种一对多(变化)的依赖关系,以便当一个对象发生变化时,所有依赖与它的对象都能接受到通知并做出相应更新。
2.观察者模式的意义和使用场景
在软件构建中,我们可能需要对一些对象建立一种“通知依赖关系”,当一个对象(目标对象)的状态发生了改变,,所有依赖对象(观察者)都能收到通知。观察者模式解开了二者之间的耦合,使得我们可以独立地改变目标和观察者。这是依赖倒置原则的体现。
3.观察者模式的实现
创建一个观察者基类,所有观察者继承于该基类,去实现对不同状态的观察。在目标对象中包含一个观察者集合,代表订阅当前对象的观察者,当目标变化发生时,无需指定某个观察者,通知(可以携带通知信息作为参数)将自动传播到所有订阅观察者。观察者自己决定是否订阅,目标对象对此一无所知。
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
| class Observer { public: virtual void update() = 0; };
class Student : public Observer { private: std::string name;
public: Student(const std::string& name) : name(name) {}
void update() override { std::cout << name << " received a notification" << std::endl; } };
class Subject { private: std::vector<Observer*> observers;
public: void attach(Observer* observer) { observers.push_back(observer); }
void detach(Observer* observer) { for (auto it = observers.begin(); it != observers.end(); ++it) { if (*it == observer) { observers.erase(it); break; } } }
void notify() { for (Observer* observer : observers) { observer->update(); } } };
class Teacher : public Subject { public: void teach() { std::cout << "Teacher is teaching" << std::endl; notify(); } };
|