国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > 互联网 > <C++ 实现设计模式> 观察者模式

<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++> ,<易学设计模式>




生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生