日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

观察者模式及c++实现

發布時間:2024/4/14 c/c++ 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 观察者模式及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++实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。