观察者模式也叫发布——订阅模式(Publish/Subscribe)模式。
主题接口Subject.h
#pragma once
#include <string>
class Observer;
class Subject
{
public:
virtual ~Subject() {}
//增加观察者
virtual void Attach(Observer* observer) = 0;
//移除观察者
virtual void Detach(Observer* observer) = 0;
//通知
virtual void Notify() = 0;
virtual void SetSecretaryAction(const std::string &action) = 0;
virtual std::string GetSecretaryAction() = 0;
};
抽象的观察者:
Observer.h
#pragma once
#include <string>
class Subject;
class Observer
{
public:
Observer(Subject *sub, std::string name):m_sub(sub),m_name(name){}
virtual ~Observer() {};
virtual void Update() = 0; //更新
protected:
Subject *m_sub;
std::string m_name;
};
具体主题,或者说是具体通知者:
ConcreteSubject.h
#pragma once
#include <list>
#include <functional>
#include "Subject.h"
class Observer;
class ConcreteSubject : public Subject
{
public:
ConcreteSubject();
~ConcreteSubject();
void Attach(Observer* observer);
void Detach(Observer* observer);
void Notify();
void SetSecretaryAction(const std::string &action);
std::string GetSecretaryAction();
private:
std::list<Observer*> m_observers;
std::string m_action;
};
ConcreteSubject.cpp
#include "ConcreteSubject.h"
#include "Observer.h"
#include <iostream>
ConcreteSubject::ConcreteSubject()
{
}
ConcreteSubject::~ConcreteSubject()
{
m_observers.clear();
}
void ConcreteSubject::Attach(Observer * observer)
{
m_observers.push_back(observer);
}
void ConcreteSubject::Detach(Observer * observer)
{
m_observers.remove_if([observer](Observer * eachObserver) {
return observer == eachObserver; //比较两指针指向的地址是否相等
});
}
void ConcreteSubject::Notify()
{
for (const auto &observer : m_observers)
{
observer->Update();
}
}
void ConcreteSubject::SetSecretaryAction(const std::string & action)
{
m_action = action;
}
std::string ConcreteSubject::GetSecretaryAction()
{
return m_action;
}
具体的观察者,也就是具体被通知人。
ConcreteObserver.h
#pragma once
#include <string>
#include <iostream>
#include "Observer.h"
#include "Subject.h"
class ConcreteObserver : public Observer
{
public:
ConcreteObserver(Subject *sub, std::string name) : Observer(sub, name) {}
~ConcreteObserver() = default;
//关闭股票行情
void Update() override
{
std::cout << "观察者" << m_name << "的状态是" << m_sub->GetSecretaryAction() << std::endl;
}
};
测试:
main.cpp
#include "ConcreteObserver.h"
#include "ConcreteSubject.h"
int main()
{
ConcreteSubject *subject = new ConcreteSubject();
ConcreteObserver *xObserver = new ConcreteObserver(subject, "X");
ConcreteObserver *yObserver = new ConcreteObserver(subject, "Y");
subject->Attach(xObserver);
subject->Attach(yObserver);
subject->Detach(yObserver);
subject->SetSecretaryAction("ABC");
subject->Notify();
delete subject;
delete xObserver;
delete yObserver;
getchar();
return 0;
}
运行结果:
观察者X的状态是ABC