Skip to content

Instantly share code, notes, and snippets.

@yknishidate
Created March 3, 2022 12:57
Show Gist options
  • Save yknishidate/e8a54b7455294963446f989ccc1524d2 to your computer and use it in GitHub Desktop.
Save yknishidate/e8a54b7455294963446f989ccc1524d2 to your computer and use it in GitHub Desktop.
#include <iostream>
#include <vector>
enum class Event
{
EntityFell,
};
class Observer
{
public:
virtual ~Observer() {}
virtual void onNotify(Event event) = 0;
};
class Achievements : public Observer
{
public:
void onNotify(Event event) override
{
switch(event){
case Event::EntityFell:
std::cout << "Achievement unlocked!" << std::endl;
break;
}
}
};
class Subject
{
public:
void addObserver(Observer* observer)
{
observers.push_back(observer);
}
protected:
void notify(Event event)
{
for(auto& observer: observers){
observer->onNotify(event);
}
}
private:
std::vector<Observer*> observers;
};
class Physics : public Subject
{
public:
void update()
{
// 通知を送信
// Achievementsと結合していない
notify(Event::EntityFell);
}
};
int main()
{
Achievements achievements;
Physics physics;
physics.addObserver(&achievements);
physics.update();
}
@yknishidate
Copy link
Author

Game Programming Pattersではさらに色々言及されてる

  • 動的確保を消すためにリストにするのもあり
  • 破棄する際にも注意が必要
  • デバッグが難しくなる場合がある
  • 現代的には、メンバ関数へのポインタをオブザーバとして登録できる方式にしたい(これピンと来てないので気になる)
  • UI用途だとデータバインディングなんかもいいかも

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment