觀察者模式,又稱發布--訂閱,mvc模式等. 通俗點講,比如股票來說,很多人關注一支股票,派一個人去觀察股票的情況,一有變化(觀察),就通知所有的預定這個消息的人.
而我們常見的mvc模式,v是指view-視圖,m指model-模型,有點類似觀察者模式,模型中的數據,一有變化就通知相關聯的視圖. 這樣很方便地隔離開了模型和視圖.
這裡使用的例子是關於博客的訂閱. 博客屬於被觀察的對象,訂閱者屬於觀察者. 訂閱者先訂閱(注冊)博客,博客一有更新,就會遍歷注冊表,給訂閱者推送更新的博客.
自己畫UML圖,,,我是自己畫的,UML圖對於寫程序確實很有幫助. 下面直接給出相應代碼:
observer.h:
#ifndef OBSERVER_H #define OBSERVER_H #include#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
#include "observer.h" #includeusing namespace std; void ObserverBlog::Update() { string status = m_blog->GetStatus(); cout << m_name << "-------" << status << endl; }
#ifndef SUBJECT_H #define SUBJECT_H #include#include "observer.h" using namespace std; class Observer; class Blog { private: list
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
#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::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;
} #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++> ,<易學設計模式>