1. Observer(观察者)
class Observer
{
public:
virtual ~Observer() = default;
virtual void update() = 0;
protected:
Observer() = default;
};
2. Subject(目标)
class Blog
{
public:
virtual ~Blog() = default;
void attach(Observer *observer)
{
m_ObserverList.push_back(observer);
}
void remove(Observer* observer)
{
m_ObserverList.remove(observer);
}
virtual void setStatus(std::string status) = 0;
virtual std::string getStatus() = 0;
//通知观察者
void notify()
{
for (auto observer : m_ObserverList)
{
observer->update();
}
}
protected:
Blog() = default;
std::string m_sStatus;
private:
std::list<Observer*> m_ObserverList;
};
3. ConcreteSubject(具体目标)
class BlogCSDN : public Blog
{
public:
explicit BlogCSDN(const std::string &name)
{
this->m_sName = name;
std::cout << "BlogCSDN 构造函数,name = " << m_sName << std::endl;
}
~BlogCSDN() override
{
std::cout << "BlogCSDN 析构函数" << std::endl;
}
void setStatus(std::string status) override
{
m_sStatus = "CSDN通知 : " + m_sName + status;
}
std::string getStatus()
{
return m_sStatus;
}
private:
std::string m_sName;
};
4. ConcreteObserver(具体观察者)
class ObserverBlog : public Observer
{
public:
explicit ObserverBlog(const std::string &name,Blog *blog)
{
this->m_sName = name;
this->m_pBlog = blog;
std::cout << "ObserverBlog 构造函数:name = " << this->m_sName << std::endl;
}
~ObserverBlog() override
{
std::cout << "ObserverBlog 析构函数" << std::endl;
}
void update() override
{
std::cout << m_sName << "收到一条" << this->m_pBlog->getStatus() << std::endl;
}
private:
std::string m_sName;
Blog *m_pBlog;
};
5. 主函数
#include <iomanip>
#include <string>
#include <vector>
#include <list>
#include <iostream>
using namespace std;
int main()
{
Blog *blog = new BlogCSDN("小胖七少爷");
Observer *observer1 = new ObserverBlog("张三", blog);
Observer *observer2 = new ObserverBlog("李四", blog);
blog->attach(observer1);
blog->attach(observer2);
std::cout << "==================" << std::endl;
blog->setStatus("发表了一篇Blog");
blog->notify();
std::cout << "==================" << std::endl;
blog->remove(observer1);
blog->setStatus("更新了一条blink");
blog->notify();
std::cout << "==================" << std::endl;
delete blog;
delete observer1;
delete observer2;
getchar();
return 0;
}