主要思想:建立一個一對多的關系,當一個對象發生發生變化時,其他對象也發生變化。
可以舉個博客訂閱的例子,當博主發表新文章的時候,即博主狀態發生了改 變,那些訂閱的讀者就會收到通知,然后進行相應的動作,比如去看文章,或者收藏起來。博主與讀者之間存在種一對多的依賴關系。下面給出相應的UML圖設 計。
#include <iostream> #include <list> #include <string> using namespace std; class Observer { public: Observer() {} virtual ~Observer() {} virtual void Update() {} }; class Blog { public: Blog(){} virtual ~Blog() {} void Attach(Observer *observer) { m_observers.push_back(observer); } void Remove(Observer* observer) { m_observers.remove(observer); } void Notify() { list<Observer*>::iterator iter = m_observers.begin(); for(;iter != m_observers.end(); iter++) (*iter)->Update(); } virtual void SetStatus(string s) { m_status = s; } virtual std::string GetStatus() { return m_status; } private: list<Observer* > m_observers; protected: std::string m_status; }; class BlogBKY : public Blog { public: BlogBKY(string name):m_name(name) {} ~BlogBKY() {} void SetStatus(string s) { m_status = s ; } string GetStatus() { return m_status; } private: string m_name; }; class ObserverBlog : public Observer { public: ObserverBlog(string name,Blog *blog):m_name(name),m_blog(blog) { } ~ObserverBlog() {} void Update() { std::string status = m_blog->GetStatus(); cout << m_name <<"-------" << status <<endl; } private: std::string m_name; Blog *m_blog; };
#include "observer.h" int main() { Blog *blog = new BlogBKY("mcy");//實例化的目標,被關注的對象,他的動態要通知觀察者。 Observer *observer1 = new ObserverBlog("hello",blog);//粉絲創建實例,關注觀察者。 blog->Attach(observer1);//博士掛載自己的觀察者 blog->SetStatus("發表博客!");//博主動態改變 blog->Notify();//博主通知觀察者 system("pause"); //delete blog; //delete observer1; return 0;
四個必須:
Subject(目標)
——目標知道它的觀察者。可以有任意多個觀察者觀察同一個目標;
——提供注冊和刪除觀察者對象的接口。
Observer(觀察者)
——為那些在目標發生改變時需獲得通知的對象定義一個更新接口。
ConcreteSubject(具體目標)
——將有關狀態存入各ConcreteObserver對象;
——當它的狀態發生改變時,向它的各個觀察者發出通知。
ConcreteObserver(具體觀察者)
——維護一個指向ConcreteSubject對象的引用;
——存儲有關狀態,這些狀態應與目標的狀態保持一致;
——實現Observer的更新接口以使自身狀態與目標的狀態保持一致。