<C++ 實現設計模式> 觀察者模式
來源:程序員人生 發布時間:2014-11-07 08:30:31 閱讀次數:3447次
視察者模式,又稱發布--定閱,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++> ,<易學設計模式>
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈