#include <iostream>
#include <vector>
using namespace std;
class Observer;
class Subject {
public:
void Attach(Observer* o) {
m_vecOb.push_back(o);
}
void Detach(Observer* o)
{
vector<Observer*>::iterator iter = find(m_vecOb.begin(), m_vecOb.end(), o);
if (iter != m_vecOb.end()) {
m_vecOb.erase(iter);
}
}
void Notify(Observer* o);
vector<Observer*> m_vecOb;
};
class Observer {
public:
virtual void update() = 0;
virtual void Notify() = 0;
};
class ObserverA : public Observer {
public:
ObserverA(Subject* p_Sub) {
m_sub = p_Sub;
}
void Attach()
{
m_sub->Attach(this);
}
void Detach()
{
m_sub->Detach(this);
}
void update()
{
cout << "ObserverA in Updating\n";
}
void Notify()
{
m_sub->Notify(this);
}
private:
Subject * m_sub;
};
class ObserverB : public Observer {
public:
ObserverB(Subject* p_Sub) {
m_sub = p_Sub;
}
void Attach()
{
m_sub->Attach(this);
}
void Detach()
{
m_sub->Detach(this);
}
void update()
{
cout << "ObserverB in Updating\n";
}
void Notify()
{
m_sub->Notify(this);
}
private:
Subject * m_sub;
};
int main(int argc, char const *argv[])
{
Subject s;
ObserverA a(&s);
ObserverB b(&s);
a.Attach();
b.Attach();
b.Notify();
}
void Subject::Notify(Observer* o)
{
for (vector<Observer*>::iterator iter = m_vecOb.begin(); iter != m_vecOb.end(); ++iter) {
if(o != *iter)
(*iter)->update();
}
}
#include <vector>
using namespace std;
class Observer;
class Subject {
public:
void Attach(Observer* o) {
m_vecOb.push_back(o);
}
void Detach(Observer* o)
{
vector<Observer*>::iterator iter = find(m_vecOb.begin(), m_vecOb.end(), o);
if (iter != m_vecOb.end()) {
m_vecOb.erase(iter);
}
}
void Notify(Observer* o);
vector<Observer*> m_vecOb;
};
class Observer {
public:
virtual void update() = 0;
virtual void Notify() = 0;
};
class ObserverA : public Observer {
public:
ObserverA(Subject* p_Sub) {
m_sub = p_Sub;
}
void Attach()
{
m_sub->Attach(this);
}
void Detach()
{
m_sub->Detach(this);
}
void update()
{
cout << "ObserverA in Updating\n";
}
void Notify()
{
m_sub->Notify(this);
}
private:
Subject * m_sub;
};
class ObserverB : public Observer {
public:
ObserverB(Subject* p_Sub) {
m_sub = p_Sub;
}
void Attach()
{
m_sub->Attach(this);
}
void Detach()
{
m_sub->Detach(this);
}
void update()
{
cout << "ObserverB in Updating\n";
}
void Notify()
{
m_sub->Notify(this);
}
private:
Subject * m_sub;
};
int main(int argc, char const *argv[])
{
Subject s;
ObserverA a(&s);
ObserverB b(&s);
a.Attach();
b.Attach();
b.Notify();
}
void Subject::Notify(Observer* o)
{
for (vector<Observer*>::iterator iter = m_vecOb.begin(); iter != m_vecOb.end(); ++iter) {
if(o != *iter)
(*iter)->update();
}
}