十分钟学会一个设计模式---行为模式---观察者模式(Observer Pattern)

91 阅读1分钟

一、应用场景

当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新

二、代码样例

class Subject; //类的前向声明

class Observer { //观察者父类
protected:
    Subject *subject;
public:
    virtual void update() = 0;
    virtual ~Observer() = default;
};

class Subject { // 被观察对象
public:
    int state = 0;
    vector<Observer *> observerList;
public:
    void notificationAllObject() {
        for (auto &observer : observerList) {
            observer->update();
        }
    }

    void setState(int state) {
        this->state = state;
        notificationAllObject();
    }

    void attach(Observer *observer) {
        this->observerList.emplace_back(observer);
    }
};

class ObserverOne : Observer { // 观察者实现
public:
    ObserverOne(Subject *subject) {
        this->subject = subject;
        this->subject->attach(this);
    }

    void update() override {
        cout << "ObserverOne, state = " << this->subject->state << endl;
    }
};

int main() {
    Subject *subject = new Subject;
    new ObserverOne(subject);
    subject->setState(1);
    subject->setState(2);
    delete subject;
}

三、缺点

  1. 观察者过多,通知会花费较长时间
  2. 观察者与被观察者之间循环依赖,导致程序崩溃