// observer.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <list>
#include <iostream>
class Observer
{
public:
virtual void Update(int) = 0;
};
class Subject {
public:
virtual void Attach(Observer*) = 0;
virtual void Detach(Observer*) = 0;
virtual void notify() = 0;
virtual void SetState(int) = 0;
};
class ConcreteObserver :public Observer {
public:
ConcreteObserver(Subject* sub)
{
m_pSubject = sub;
}
virtual void Update(int val) {
std::cout << "ob1 " << val << std::endl;
}
private:
Subject* m_pSubject;
};
class ConcreteObserver2 :public Observer {
public:
ConcreteObserver2(Subject* sub)
{
m_pSubject = sub;
}
virtual void Update(int val) {
std::cout << "ob2 " << val << std::endl;
}
private:
Subject* m_pSubject;
};
class ConcreteSubject :public Subject {
public:
virtual void Attach(Observer* ob) {
m_list.push_back(ob);
}
virtual void Detach(Observer* ob) {
m_list.remove(ob);
}
virtual void notify() {
for each (auto var in m_list)
{
var->Update(m_iState);
}
}
void SetState(int state) {
m_iState = state;
}
private:
std::list<Observer*> m_list;
int m_iState;
};
int main()
{
Subject* pSub = new ConcreteSubject();
pSub->SetState(2);
Observer* pObj1 = new ConcreteObserver(pSub);
Observer* pObj2 = new ConcreteObserver2(pSub);
pSub->Attach(pObj1);
pSub->Attach(pObj2);
pSub->notify();
pSub->SetState(4);
pSub->notify();
pSub->Detach(pObj1);
pSub->SetState(6);
pSub->notify();
system("pause");
return 0;
}