
#include <string>
#include <iostream>
#include <list>
class Observer
{
public:
Observer() {}
virtual ~Observer() {}
virtual void Update() {}
};
class Subject
{
public:
Subject() {}
virtual ~Subject() {}
void Attach(Observer *observer) { m_observers.push_back(observer); }
void Remove(Observer *observer) { m_observers.remove(observer); }
void Notify() {
std::list<Observer*>::iterator iter = m_observers.begin();
for (; iter != m_observers.end(); iter++)
(*iter)->Update();
}
virtual void SetXXXXXX(std::string s) { m_xxxxxx = s; }
virtual std::string GetXXXXXX() { return m_xxxxxx; }
protected:
std::string m_xxxxxx;
private:
std::list<Observer* > m_observers;
};
class SpecificObserver : public Observer
{
private:
std::string m_name;
Subject *m_subject;
public:
SpecificObserver(std::string name, Subject *sub) : m_name(name), m_subject(sub) {}
~SpecificObserver() {}
void Update() {
std::string status = m_subject->GetXXXXXX();
std::cout << m_name << "-------" << status << std::endl;
}
};
class SpecificSubject : public Subject
{
private:
std::string m_name;
public:
SpecificSubject(std::string name) : m_name(name) {}
~SpecificSubject() {}
void SetXXXXXX(std::string s) {
m_xxxxxx = m_name + " " + s;
}
std::string GetXXXXXX() {
return m_xxxxxx;
}
};
int main()
{
Subject *blog = new SpecificSubject("topic");
Observer *observer1 = new SpecificObserver("cat", blog);
Observer *observer2 = new SpecificObserver("dog", blog);
blog->Attach(observer1);
blog->Attach(observer2);
blog->SetXXXXXX("call");
blog->Notify();
delete blog;
delete observer1;
return 0;
}
/*
cat-------topic call
dog-------topic call
*/