<C++ 实现设计模式> 观察者模式
来源:程序员人生 发布时间:2014-11-07 08:30:31 阅读次数:3305次
视察者模式,又称发布--定阅,mvc模式等. 通俗点讲,比如股票来讲,很多人关注1支股票,派1个人去视察股票的情况,1有变化(视察),就通知所有的预定这个消息的人.
而我们常见的mvc模式,v是指view-视图,m指model-模型,有点类似视察者模式,模型中的数据,1有变化就通知相干联的视图. 这样很方便地隔离开了模型和视图.
这里使用的例子是关于博客的定阅. 博客属于被视察的对象,定阅者属于视察者. 定阅者先定阅(注册)博客,博客1有更新,就会遍历注册表,给定阅者推送更新的博客.
自己画UML图,,,我是自己画的,UML图对写程序确切很有帮助. 下面直接给出相应代码:
observer.h:
#ifndef OBSERVER_H
#define OBSERVER_H
#include<string>
#include "subject.h"
using namespace std;
class Blog;
class BlogCSDN;
class Observer
{
public:
Observer() {}
virtual ~Observer() {}
virtual void Update() {}
};
class ObserverBlog : public Observer
{
private:
string m_name; //视察者名称
Blog *m_blog; //视察的博客,以链表的情势更好,可以视察多个博客
public:
ObserverBlog(string name, Blog *blog): m_name(name), m_blog(blog) {}
~ObserverBlog() {}
void Update();
};
#endif
observer.cpp
#include "observer.h"
#include<iostream>
using namespace std;
void ObserverBlog::Update()
{
string status = m_blog->GetStatus();
cout << m_name << "-------" << status << endl;
}
subject.h
#ifndef SUBJECT_H
#define SUBJECT_H
#include<list>
#include "observer.h"
using namespace std;
class Observer;
class Blog
{
private:
list<Observer *> m_observers; //视察者列表
protected:
string m_status; //状态
public:
Blog() {}
virtual ~Blog() {}
void Attach(Observer *observer); //添加视察者
void Remove(Observer *observer); //移除视察者
void Notify(); //通知视察者
virtual void SetStatus(string s); //设置状态
virtual string GetStatus(); //取得状态
};
class BlogCSDN : public Blog
{
private:
string m_name; //博主名字
public:
BlogCSDN(string name) : m_name(name) {}
~BlogCSDN() {}
void SetStatus(string s);
string GetStatus();
};
#endif
subject.cpp
#include "subject.h"
void Blog::Attach(Observer *observer)
{
m_observers.push_back(observer);
}
void Blog::Remove(Observer *observer)
{
m_observers.remove(observer);
}
void Blog::Notify()
{
list<Observer *>::iterator iter = m_observers.begin();
for(; iter != m_observers.end(); iter++) {
(*iter)->Update();
}
}
void Blog::SetStatus(string s)
{
m_status = s;
}
string Blog::GetStatus()
{
return m_status;
}
void BlogCSDN::SetStatus(string s)
{
m_status = "csdn通知: " +m_name + s;
}
string BlogCSDN::GetStatus()
{
return m_status;
}
main.cpp
#include "observer.h"
#include "subject.h"
int main()
{
Blog *blog = new BlogCSDN("zy416548283");
Observer *observer = new ObserverBlog("tutupig", blog);
blog->Attach(observer);
blog->SetStatus("发表视察者模式实现的文章");
blog->Notify();
delete blog;
delete observer;
return 0;
}
编译运行:
zy@zyPc:~/code/Cplus/designPattern/observer$ ./a.out
tutupig-------csdn通知: zy416548283发表***文章
如果自己写程序遇到交叉援用的问题(头文件相互援用,又调用了类中的方法之类的),可以参考帖子:点击打开链接 ,也能够看看我的发问:点击打开链接
PS:
参考博客:点击打开链接
参考书籍:<23种设计模式-C++> ,<易学设计模式>
生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠