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