#include <iostream>
#include <functional>
#include <vector>
#include <mutex>
using namespace std;
typedef function<void (float )> Func;
struct value{
string name;
Func func;
};
class Subject
{
public:
static Subject& instance() {
static Subject* p = NULL;
if(p == NULL) {
p = new Subject;
}
return *p;
}
Subject() {}
void Attach(string na, Func f); //注册观察者
void Detach(string na); //注销观察者
void Notify(float price); //通知观察者
private:
vector<value> m_value;
mutex m_mutex;
};
void Subject::Attach(string na, Func f)
{
m_mutex.lock();
m_value.push_back(value{na, f});
m_mutex.unlock();
}
void Subject::Detach(string na)
{
m_mutex.lock();
vector<value>::iterator it;
for(it=m_value.begin();it!=m_value.end();it++){
if((*it).name == na){
m_value.erase(it);
break;
}
}
m_mutex.unlock();
}
void Subject::Notify(float price)
{
vector<value>::iterator it;
for(it=m_value.begin();it!=m_value.end();it++){
it->func(price);
}
}
void add(float price)
{
cout<<"add function : "<<(price + price)<<endl;
return;
}
void sub(float price)
{
if(price == 20.0) {
cout<<"sub function : "<<price - 1<<endl;
} else {
cout<<"price is not equal to 20.0"<<endl;
}
return;
}
int main(int argc, char *argv[])
{
cout << "Hello World!" << endl;
// 创建主题、观察者
Subject::instance().Attach("add", add);
Subject::instance().Attach("sub", sub);
Subject::instance().Notify(13);
Subject::instance().Detach("sub");
Subject::instance().Notify(15);
return 0;
}
c++ 互斥锁,单例,观察者模式应用
于 2020-02-21 09:16:05 首次发布