【デザインパターン】Observer

どんなもの?

  • 一つのオブジェクトの状態が変わったら、依存関係にあるオブジェクトへ通知される
  • MVCの中のViewに相当する

どういうときに使う?

  • 観測対象のオブジェクトの状態が変わったときに、通知されたいとき

典型的な構成要素

  • Subject
  • Observer

コード

#include <iostream>
#include <string>
#include <vector>
using namespace std;

class Observer{
public:
  virtual void update() = 0;
};

class Subject{
public:
  void add(Observer *obs){
    views.push_back(obs);
  }
  void notify(){
    for(int i=0; i<views.size(); i++){
      views[i]->update();
    }
  }
private:
  vector<Observer *> views;
};

class ConcreteObserver: Observer{
public:
  ConcreteObserver(Subject *subj, string name){
    subj->add(this);
    this->name = name;
  }
  void update(){
    cout << this->name << " is updated" << endl;
  }
private:
  string name;
};

int main(){
  Subject subj;
  ConcreteObserver obs1(&subj, "observer1");
  ConcreteObserver obs2(&subj, "observer2");
  subj.notify();
  return 0;
}