设计模式C++实现(7)——观察者模式
生活随笔
收集整理的這篇文章主要介紹了
设计模式C++实现(7)——观察者模式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?觀察者模式:定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于它的對象都得到通知并被自動更新。它還有兩個別名,依賴(Dependents),發布-訂閱(Publish-Subsrcibe)。可以舉個博客訂閱的例子,當博主發表新文章的時候,即博主狀態發生了改變,那些訂閱的讀者就會收到通知,然后進行相應的動作,比如去看文章,或者收藏起來。博主與讀者之間存在種一對多的依賴關系。下面給出相應的UML圖設計。
?
? ? ? ? ? ? ? ? ? ? ?
??可以看到博客類中有一個觀察者鏈表(即訂閱者),當博客的狀態發生變化時,通過Notify成員函數通知所有的觀察者,告訴他們博客的狀態更新了。而觀察者通過Update成員函數獲取博客的狀態信息。代碼實現不難,下面給出C++的一種實現。
/** @Author: Zhibo Wang* @Date: 2021-04-22 11:04:14* @LastEditTime: 2021-04-22 11:31:49*/ #include <bits/stdc++.h>using namespace std;class Observer { public:Observer(){}virtual ~Observer() {}virtual void Update() {} };class Blog { public:Blog() {}virtual ~Blog() {}void AddObserver(Observer *server){m_observers.push_back(server);}void RemoveObserver(Observer *server){m_observers.remove(server);}void Notify(){for (auto s : m_observers){s->Update();}}virtual void SetStatus(string s){m_status = s;}virtual string GetStatus(){return m_status;}protected:string m_status;list<Observer *> m_observers; };class BlogCSDN : public Blog { public:BlogCSDN(string name): m_name(name){}~BlogCSDN(){}void SetStatus(string s){m_status = "CSDN通知:" + m_name + s;}string GetStatus(){return m_status;}private:string m_name; };class ObserverBlog : public Observer { public:string m_name;Blog *m_blog;ObserverBlog(string name, Blog *blog): m_name(name), m_blog(blog){}~ObserverBlog(){}void Update(){string status = m_blog->GetStatus();cout << m_name << "更新:" << status << endl;} };int main() {Blog *blog = new BlogCSDN("wuzhekai1985");Observer *observer1 = new ObserverBlog("tutupig", blog);blog->AddObserver(observer1);blog->SetStatus("發表設計模式C++實現(15)——觀察者模式");blog->Notify();delete blog;delete observer1;return 0; }?
總結
以上是生活随笔為你收集整理的设计模式C++实现(7)——观察者模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式C++实现(5)——原型模式
- 下一篇: C++图解前缀树(字典树)