建设企业网站的哪家好,微信小程序开通流程,域名解析网站打不开,一个完整的产品规划方案Observer模式
观察者模式#xff08;Observer Pattern#xff09;是一种行为设计模式#xff0c;它定义了对象之间的依赖关系#xff0c;当一个对象的状态发生改变时#xff0c;所有依赖于它的对象都会得到通知并被自动更新。
观察者模式主要包含以下几个角色#xff1…Observer模式
观察者模式Observer Pattern是一种行为设计模式它定义了对象之间的依赖关系当一个对象的状态发生改变时所有依赖于它的对象都会得到通知并被自动更新。
观察者模式主要包含以下几个角色
Subject主题也被称为Observable它是被观察的对象。当它的状态发生改变时会通知所有的观察者。Observer观察者它是观察Subject的对象当Subject的状态发生改变时会收到通知。
观察者模式的主要优点是
支持简单的广播通信Subject发生改变时所有注册的Observer都会收到通知。低耦合Subject和Observer可以独立修改只要不改变他们之间的通信方式。
观察者模式适用于以下场景
当一个抽象模型有两个方面其中一个方面依赖于另一个方面。将这两者封装在独立的对象中以使它们可以各自独立地改变和复用。当对一个对象的改变需要同时改变其他对象而不知道具体有多少对象有待改变。当一个对象必须通知其他对象而它又不能假定其他对象是谁。换言之你不希望这些对象是紧密耦合的。
以下是一个简单的C实现的观察者模式Observer Pattern示例
#include iostream
#include list// 前向声明
class Observer;// 主题
class Subject {
public:void attach(Observer* observer) {observers_.push_back(observer);}void detach(Observer* observer) {observers_.remove(observer);}void notify();private:std::listObserver* observers_;
};// 观察者
class Observer {
public:Observer(Subject* subject) : subject_(subject) {subject_-attach(this);}virtual void update() 0;protected:Subject* subject_;
};void Subject::notify() {for (Observer* observer : observers_) {observer-update();}
}// 具体观察者A
class ConcreteObserverA : public Observer {
public:ConcreteObserverA(Subject* subject) : Observer(subject) {}void update() override {std::cout Concrete Observer A is updated. std::endl;}
};// 具体观察者B
class ConcreteObserverB : public Observer {
public:ConcreteObserverB(Subject* subject) : Observer(subject) {}void update() override {std::cout Concrete Observer B is updated. std::endl;}
};int main() {Subject subject;ConcreteObserverA observerA(subject);ConcreteObserverB observerB(subject);subject.notify();return 0;
}在这个例子中Subject是主题它维护了一个观察者列表。当主题的状态发生改变时它会调用notify方法通知所有的观察者。 Observer是观察者它定义了一个update接口。ConcreteObserverA和ConcreteObserverB是具体的观察者它们实现了update接口。 通过这种方式我们可以实现当主题的状态发生改变时所有观察者都会得到通知并自动更新。