#include <iostream>
#include <vector>
#include <string>
using namespace std;
typedef string State; class Observer; // 目标
class Subject {
public:
Subject() {}
virtual ~Subject() {} virtual void Attach(Observer *pObserver);
virtual void Detach(Observer *pObserver);
virtual void Notify();
virtual State GetState()=0;
virtual void SetState(const State& nState)=0;
private:
vector<Observer*> m_observers;
}; // 具体目标
class ConcreteSubject : public Subject {
public:
ConcreteSubject() {}
virtual ~ConcreteSubject() {} virtual State GetState();
virtual void SetState(const State& nState);
private:
State m_State;
}; // 观察者
class Observer {
public:
Observer() {}
virtual ~Observer(){} virtual void Update(Subject* pSubject)=0;
}; // 具体观察者
class ConcreteObserver : public Observer {
public:
ConcreteObserver(string nSubjectName, Subject * pSubject);
virtual ~ConcreteObserver(); virtual void Update(Subject* pSubject);
private:
string m_SubjectName;
State m_State;
Subject *m_pSubject;
}; // Subject
void Subject::Attach(Observer *pObserver) {
m_observers.push_back(pObserver);
}
void Subject::Detach(Observer *pObserver) {
for (vector<Observer*>::iterator iter = m_observers.begin(); iter != m_observers.end(); ++iter) {
if (*iter == pObserver) {
m_observers.erase(iter);
return;
}
}
}
void Subject::Notify() {
for (vector<Observer*>::iterator iter = m_observers.begin(); iter != m_observers.end(); ++iter) {
(*iter)->Update(this);
}
} // ConcreteSubject
State ConcreteSubject::GetState() {
return m_State;
}
void ConcreteSubject::SetState(const State& nState) {
m_State = nState;
} // ConcreteObserver
ConcreteObserver::ConcreteObserver(string nSubjectName, Subject * pSubject) {
m_SubjectName = nSubjectName;
m_pSubject = pSubject;
m_pSubject->Attach(this);
}
ConcreteObserver::~ConcreteObserver() {
m_pSubject->Detach(this);
if (m_pSubject != 0) delete m_pSubject;
}
void ConcreteObserver::Update(Subject* pSubject) {
m_State = pSubject->GetState();
cout << "observer name: " << m_SubjectName << " " << "state: " << m_State << endl;
} int main() {
ConcreteSubject * pConcreteSubject = new ConcreteSubject();
Observer * o1 = new ConcreteObserver("observer1",pConcreteSubject);
Observer * o2 = new ConcreteObserver("observer2",pConcreteSubject);
pConcreteSubject->SetState("State_1");
pConcreteSubject->Notify();
pConcreteSubject->SetState("State_2");
pConcreteSubject->Notify();
return 0;
}

最新文章

  1. webpack入坑之旅(三)webpack.config入门
  2. Code First05--CodeFirst中值对象
  3. unix network programming volume1 sorce code build and get(UNIX網絡編程卷1第三版)
  4. HTTP笔记之一
  5. java 多线程编程三种实现方式
  6. list&lt;T&gt; 自定义比较器进行排序
  7. Quartz.NET开源作业调度架构
  8. [mysql]刷新windows恢复后mysql和&amp;quot;Access denied for user&amp;#39;root&amp;#39;@&amp;#39;IP&amp;#39;&amp;quot;处理问题
  9. 使用 Aspose.Cells 实现 excel导入
  10. scrapy在ubuntu上安装总结
  11. unity3d之在屏幕上画线
  12. 【翻译】在Ext JS中创建特定主题的重写
  13. Qt551.主窗体Margin
  14. [开源 .NET 跨平台 Crawler 数据采集 爬虫框架: DotnetSpider] 学习
  15. Pyperclip could not find a copy/paste mechanism for your system.
  16. 关于trim,ltrim ,rtrim 的 移除问题
  17. VS Code设置中文插件
  18. 使用 Travis 进行持续集成
  19. hbase 定时备份
  20. linux系统,在centos7环境下安装jdk步骤

热门文章

  1. php原生函数应用
  2. Github C 编译器项目 8cc main函数中用到的 C库函数
  3. cmd命令行中无pip命令的解决办法
  4. ajax 技术
  5. yum报[Errno 256] No more mirrors to try
  6. Mysql使用规范及建议
  7. CodeForces - 1058D D. Vasya and Triangle
  8. codeforce 266c Below the Diagonal 矩阵变换 (思维题)
  9. spark系列-3、缓存、共享变量
  10. 搜索+简单dp