C++設計モードを実現する観察者モード

21337 ワード

1.観察者モードとは?
オブザーバモード(パブリッシュサブスクリプションSubscribe>モード、モデルビューView>モード、ソースリスナーListener>モードまたはスレーブモードとも呼ばれる場合もある)は、ソフトウェア設計モードの1つである.このモードでは、1つのターゲットオブジェクトは、それに依存するすべてのオブジェクトを管理し、それ自体の状態が変化したときに自発的に通知を発行します.これは、通常、各観察者が提供する方法を呼び出すことによって達成される.このモードは、通常、イベント処理システムを実装するために使用される.
 
2.何の役に立つの?
オブザーバー設計モードは、オブジェクト間の1対多の依存関係を定義し、1つのオブジェクトの状態が変化すると、それに依存するすべてのオブジェクトが通知され、自動的にリフレッシュされます.例えば:ゲームの中で、プレイヤーがAttackをトリガーすると、インタフェースの一連の変化:キャラクター攻撃アニメーションの再生、モンスターの倒地、ダメージ量の計算と表示.これらの変化はプレイヤーattack動作に基づいている.これらの変化は無限に拡張できる.
3.プログラムサンプルコード
このプログラムは簡単に会社の中のシーンを実現しました.サボっている社員(observer)たちがボスがいないうちに、こっそり自分の私事をしている.ボスに捕まえられる心配はありません.彼らはとっくに入り口のフロントMay(subject)に知らせています.ボスが帰ってきたら、すぐに知らせます.以下は本プログラムのすべてのコードで、linuxの下でコンパイルは正常に実行して、本プログラムがboostライブラリのshared_を使ったことに注意しますptr .正常に動作するには、Boostライブラリをインストールする必要があります.
 1 //file name : BaseObserver.h
 2 
 3 #ifndef __BASE_OBSERVER_H__
 4 #define __BASE_OBSERVER_H__
 5 
 6 #include <string>
 7 
 8 #include "BaseSubject.h"
 9 #include <boost/shared_ptr.hpp>
10 
11 using namespace std;
12 using namespace boost;
13 
14 typedef shared_ptr<BaseSubject> basesubject_t;
15 
16 class BaseObserver    //      
17 {
18     protected :
19         std::string m_name;
20         basesubject_t m_sub;
21 
22     public :
23         BaseObserver();
24         BaseObserver(std::string name, basesubject_t sub);
25         virtual void Update()
26         {
27         }
28 };
29 
30 #endif
 1 //file name : BaseObserver.cpp
 2 
 3 #include "BaseObserver.h"
 4 
 5 BaseObserver::BaseObserver()
 6 {
 7 
 8 }
 9 
10 BaseObserver::BaseObserver(std::string name, basesubject_t sub):  m_name(name), m_sub(sub)
11 {
12     
13 }
 1 //file name BaseSubject.h
 2 
 3 #ifndef __BASE_SUBJECT_H__
 4 #define __BASE_SUBJECT_H__
 5 
 6 #include <list>
 7 #include <string>
 8 #include <boost/shared_ptr.hpp>
 9 
10 using namespace std;
11 using namespace boost;
12 
13 class BaseObserver;
14 
15 typedef shared_ptr<BaseObserver> baseobserver_t;
16 
17 class BaseSubject
18 {
19    
20     private :
21         std::list<baseobserver_t> m_observers;
22 
23     public :
24         void Attach(baseobserver_t ob);
25 
26         void Detach(BaseObserver* ob);
27         
28         void Notify();
29 
30     public : 
31         string m_subject_state;
32 };
33 
34 #endif
 1 //file name BaseSubject.cpp
 2 
 3 
 4 #include "BaseSubject.h"
 5 #include "BaseObserver.h"
 6 #include <iostream>
 7 
 8 
 9 void BaseSubject::Attach(baseobserver_t ob)
10 {
11     m_observers.push_back(ob);
12 }
13 
14 
15 void BaseSubject::Detach(BaseObserver* ob)
16 {
17     
18 }
19 
20 void BaseSubject::Notify()
21 {
22     for(std::list<baseobserver_t>::const_iterator it = m_observers.begin(); it != m_observers.end(); ++it)
23     {   
24        (*it)->Update();
25     }    
26 }
 1 //file name: bossSecretaryWorkers.cpp
 2 
 3 #include <ostream>
 4 #include <list>
 5 #include <string>
 6 
 7 #include "boost/shared_ptr.hpp"
 8 
 9 #include "BaseObserver.h"
10 #include "BaseSubject.h"
11 
12 using namespace std;
13 using namespace boost;
14 
15 class Secretary : public BaseSubject
16 {
17 
18 };
19 
20 class Boss : public BaseSubject
21 {
22 
23 };
24 
25 class StockObserver : public BaseObserver
26 {
27     public :
28        StockObserver(string name, basesubject_t sub) : BaseObserver(name, sub)
29         {
30             
31         }
32         
33        void CloseStock()
34         {
35             cout<<m_sub->m_subject_state<<m_name<<"   CloseStock"<<endl;
36         }
37         
38         void Update()
39         {
40             CloseStock();
41         }
42 };
43 
44 class NBAObserver : public BaseObserver
45 {
46     public :
47        NBAObserver(string name, basesubject_t sub): BaseObserver(name, sub)
48         {  
49         }
50         
51         void Update()
52         {
53             CloseNBA();
54         }
55         
56         void CloseNBA()
57         {
58             cout<<m_sub->m_subject_state<<m_name<<"   NBA"<<endl;
59         }
60 };
61 
62 typedef shared_ptr<Boss> boss_t;
63 typedef shared_ptr<Secretary> secretary_t;
64 typedef shared_ptr<StockObserver> stockobserver_t;
65 typedef shared_ptr<NBAObserver> nbaobserver_t;
66 
67 int main(int argc, char** argv)
68 {
69     boss_t boss(new Boss());
70     secretary_t may(new Secretary());
71     stockobserver_t neo(new StockObserver("neo", may));
72     nbaobserver_t jason(new NBAObserver("jason", may));
73     
74     may->m_subject_state = "";
75     may->Attach(neo);
76     may->Attach(jason);
77     
78     (*may).Notify();
79     
80     
81 /*  
82    boss->m_subject_state = "     ! ";
83     boss->Attach(neo);
84     boss->Attach(jason);
85 */    
86     (*boss).Notify();
87 
88     return 0;
89 }