观察者模式及c++实现
生活随笔
收集整理的這篇文章主要介紹了
观察者模式及c++实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?觀察者模式概念:定義對象間的一種一對多的依賴關系,以便當一個對象的狀態發生改變時,全部依賴于它的對象都得到通知并自己主動更新。“Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.” – GoF
UML圖
特點:
??? 1.觀察者模式定義了對象之間一對多的關系。
??? 2.主題(也就是可觀察者)用一個共同的接口來更新觀察者。
??? 3.觀察者和可觀察者用松耦合的方式結合,可觀察者不知道觀察者的細節,僅僅知道觀察者實現了觀察者接口
??? 4.有多個觀察者時,不能夠依賴特點的通知次序。
C++源碼:
Observer.h
/*觀察者模式:在對象之間定義一對多的依賴,這樣一來,當一個對象改變狀態,依賴它的對象都會收到通知,并自己主動更新。 */#include <iostream> #include <vector> using namespace std;class Observer;//Account抽象類,用作接口 class Account { protected:vector<Observer*> observer;double balance; public:virtual void add_observer(Observer *o)=0;virtual void remove_observer(Observer *o)=0;virtual void notify_observer()=0;virtual void set_balance(double balance)=0;virtual double get_balance()=0; public:virtual ~Account(){cout<<"in the destructor of Account"<<endl;} };//Observer抽象類,用作接口 class Observer { protected:Account *account; public:Observer(Account *account):account(account) {}virtual void handle_event()=0;virtual void set_account_balance(double balance)=0;virtual ~Observer(){cout<<"in the destructor of Observer"<<endl;} };//BankAccount詳細類,繼承了ACcount抽象類 class BankAccount:public Account { public:~BankAccount(){cout<<"in the destructor of BankAccount"<<endl;}public:void add_observer(Observer *o){observer.push_back(o);}void remove_observer(Observer *o){for(vector<Observer*>::iterator it=observer.begin(); it!=observer.end(); it++){if(o==*it){observer.erase(it);return;}}}void notify_observer(){for(vector<Observer*>::const_iterator it=observer.begin(); it!=observer.end(); it++){(*it)->handle_event();}}void set_balance(double balance){this->balance=balance;notify_observer();}double get_balance(){return balance;}};class ATM:public Observer { public:ATM(Account *account):Observer(account)//將acount傳遞給基類Observer的構造函數{}~ATM(){cout<<"in the destructor of ATM"<<endl;} public:void handle_event(){cout<<"ATM: the balance of bank accont is changed to "<<account->get_balance()<<endl;}void set_account_balance(double balance){account->set_balance(balance);} };class InternetBankService:public Observer { public:InternetBankService(Account *account):Observer(account) {}~InternetBankService(){cout<<"in the destructor InternetBankService "<<endl;} public:void handle_event(){cout<<"IBS: the balance of bank account is changed to:"<<account->get_balance()<<endl;}void set_account_balance(double balance){account->set_balance(balance);}};
Observer.cpp
?
#include "Observer.h" int main(int argc, char **argv) {Account *account=new BankAccount();Observer *atm_observer=new ATM(account);Observer *ibs_observer=new InternetBankService(account);account->add_observer(atm_observer);account->add_observer(ibs_observer);account->set_balance(1000.12);cout<<"Event is triggered by atm_observer"<<endl;cout<<"============="<<endl;atm_observer->set_account_balance(1000.23);cout<<"Event is triggered by ibs_observer"<<endl;cout<<"============="<<endl;ibs_observer->set_account_balance(1000.36);delete atm_observer;delete ibs_observer;return 0; }例2:
Test_Observer.cpp
/*千萬要注意對象切割問題的出現。一定要理解。 */ #include <iostream> #include <string> #include <vector> using namespace std;class Observer { protected:string name; public:virtual void update(){cout<<"Observer"<<endl;} };class Man:public Observer { public:Man(string name){this->name=name;}void update(){cout<<name<<" Man is coming"<<endl;} }; class Woman:public Observer { public:Woman(string name){this->name=name;}void update(){cout<<name<<" Woman is leaving"<<endl;} };class Subject { private:vector<Observer*> obser; public:void add(Observer &ob){obser.push_back(&ob);}void notify(){for (vector<Observer*>::iterator it=obser.begin(); it!=obser.end(); it++){(*it)->update();}} };int main() {Subject secret;Man m1("m1--");Man m2("m2--");Woman w1("w1");Woman w2("w2");secret.add(m1);secret.add(m2);secret.add(w1);secret.add(w2);secret.notify();return 0;}
?
?
?
?
?
總結
以上是生活随笔為你收集整理的观察者模式及c++实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 12款响应式的 jQuery 旋转木马(
- 下一篇: 【Adaboost算法】C++转C, 分