八六二网

八六二网

19-观察者模式(Observer)

admin
意图19-观察者模式(Observer)-第1张-游戏相关-八六二网

观察者模式是一种行为型设计模式。它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知被自动更新。

结构性

观察者模式结构图

代码示例
#include <algorithm>#include <iostream>#include <list>#include <string>class Observer {public:    Observer() {}    virtual ~Observer() {}    virtual void Update() = 0;};class Subject {public:    Subject() {}    virtual ~Subject() {}    void Attach(Observer* observer) {        _observers.push_back(observer);    }    void Detach(Observer* observer) {        _observers.remove(observer);    }    void Notify() {        for (auto observer : _observers) {            observer->Update();        }    }    virtual std::string GetState() const {        return _subjectState;    }    virtual void SetState(const std::string& state) {        _subjectState = state;    }protected:    std::list<Observer*> _observers;    std::string _subjectState;};class ConcreteSubject : public Subject {public:    ConcreteSubject() {}    virtual ~ConcreteSubject() {}    void SetState(const std::string& state) override {        _subjectState = "concrete subject state <" + state + ">";    }};class ConcreteObserver : public Observer {public:    ConcreteObserver(Subject* subject) : _subject(subject) {}    virtual ~ConcreteObserver() {}    void Update() override {        _observerState = _subject->GetState();        std::cout << "Observe subject state: " << _observerState << std::endl;    }protected:    Subject* _subject;    std::string _observerState;};int main(int argc, char* argv[]) {    Subject* subject = new ConcreteSubject();    Observer* observer = new ConcreteObserver(subject);    subject->Attach(observer);    subject->SetState("state 1");    subject->Notify();    return 0;}

观察者模式运行结果

适用性当一个抽象模型有两个方面,其中一个方面依赖另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用;当对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变;当一个对象必须通知其他对象,而它又不能假定其它对象是谁。换言之,你不希望这些对象是紧密耦合的。

标签 我的世界观察者模式