生活随笔
收集整理的這篇文章主要介紹了
设计模式C++实现(15)——观察者模式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? ? ? ? 觀察者模式:定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于它的對象都得到通知并被自動更新。它還有兩個別名,依賴(Dependents),發布-訂閱(Publish-Subsrcibe)。可以舉個博客訂閱的例子,當博主發表新文章的時候,即博主狀態發生了改變,那些訂閱的讀者就會收到通知,然后進行相應的動作,比如去看文章,或者收藏起來。博主與讀者之間存在種一對多的依賴關系。下面給出相應的UML圖設計。
? ? ? ?可以看到博客類中有一個觀察者鏈表(即訂閱者),當博客的狀態發生變化時,通過Notify成員函數通知所有的觀察者,告訴他們博客的狀態更新了。而觀察者通過Update成員函數獲取博客的狀態信息。代碼實現不難,下面給出C++的一種實現。
[cpp]?view plaincopy print?
?? 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?string?GetStatus()?{?return?m_status;?}?????? private:?? ????list<Observer*?>?m_observers;??? protected:?? ????string?m_status;??? };??
? ? ? 以上是觀察者和博客的基類,定義了通用接口。博客類主要完成觀察者的添加、移除、通知操作,設置和獲得狀態僅僅是一個默認實現。下面給出它們相應的子類實現。? ? ?
[cpp]?view plaincopy print?
?? class?BlogCSDN?:?public?Blog?? {?? private:?? ????string?m_name;??? public:?? ????BlogCSDN(string?name):?m_name(name)?{}?? ????~BlogCSDN()?{}?? ????void?SetStatus(string?s)?{?m_status?=?"CSDN通知?:?"?+?m_name?+?s;?}??? ????string?GetStatus()?{?return?m_status;?}?? };?? ?? 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()???? ????{??? ????????string?status?=?m_blog->GetStatus();?? ????????cout<<m_name<<"-------"<<status<<endl;?? ????}?? };??
? ? ? 客戶的使用方式:
[cpp]?view plaincopy print?
?? int?main()?? {?? ????Blog?*blog?=?new?BlogCSDN("wuzhekai1985");?? ????Observer?*observer1?=?new?ObserverBlog("tutupig",?blog);?? ????blog->Attach(observer1);?? ????blog->SetStatus("發表設計模式C++實現(15)——觀察者模式");?? ????blog->Notify();?? ????delete?blog;?delete?observer1;?? ????return?0;?? }??
總結
以上是生活随笔為你收集整理的设计模式C++实现(15)——观察者模式的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。