C++設計モードを実現する観察者モード
21337 ワード
1.観察者モードとは?
オブザーバモード(パブリッシュサブスクリプションSubscribe>モード、モデルビューView>モード、ソースリスナーListener>モードまたはスレーブモードとも呼ばれる場合もある)は、ソフトウェア設計モードの1つである.このモードでは、1つのターゲットオブジェクトは、それに依存するすべてのオブジェクトを管理し、それ自体の状態が変化したときに自発的に通知を発行します.これは、通常、各観察者が提供する方法を呼び出すことによって達成される.このモードは、通常、イベント処理システムを実装するために使用される.
2.何の役に立つの?
オブザーバー設計モードは、オブジェクト間の1対多の依存関係を定義し、1つのオブジェクトの状態が変化すると、それに依存するすべてのオブジェクトが通知され、自動的にリフレッシュされます.例えば:ゲームの中で、プレイヤーがAttackをトリガーすると、インタフェースの一連の変化:キャラクター攻撃アニメーションの再生、モンスターの倒地、ダメージ量の計算と表示.これらの変化はプレイヤーattack動作に基づいている.これらの変化は無限に拡張できる.
3.プログラムサンプルコード
このプログラムは簡単に会社の中のシーンを実現しました.サボっている社員(observer)たちがボスがいないうちに、こっそり自分の私事をしている.ボスに捕まえられる心配はありません.彼らはとっくに入り口のフロントMay(subject)に知らせています.ボスが帰ってきたら、すぐに知らせます.以下は本プログラムのすべてのコードで、linuxの下でコンパイルは正常に実行して、本プログラムがboostライブラリのshared_を使ったことに注意しますptr .正常に動作するには、Boostライブラリをインストールする必要があります.
オブザーバモード(パブリッシュサブスクリプション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 }