观察者模式及c++实现

原文地址:http://blog.csdn.net/mafuli007/article/details/7239709

观察者模式概念:定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。“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

  1. /* 
  2.     观察者模式:在对象之间定义一对多的依赖,这样一来,当一个对象改变状态, 
  3.     依赖它的对象都会收到通知,并自动更新。 
  4. */  
  5.   
  6. #include <iostream>  
  7. #include <vector>  
  8. using namespace std;  
  9.   
  10. class Observer;  
  11.   
  12. //Account抽象类,用作接口  
  13. class Account  
  14. {  
  15. protected:  
  16.     vector<Observer*> observer;  
  17.     double balance;  
  18. public:  
  19.     virtual void add_observer(Observer *o)=0;  
  20.     virtual void remove_observer(Observer *o)=0;  
  21.     virtual void notify_observer()=0;  
  22.     virtual void set_balance(double balance)=0;  
  23.     virtual double get_balance()=0;  
  24. public:  
  25.     virtual ~Account()  
  26.     {  
  27.         cout<<"in the destructor of Account"<<endl;  
  28.     }  
  29. };  
  30.   
  31. //Observer抽象类,用作接口  
  32. class Observer  
  33. {  
  34. protected:  
  35.     Account *account;  
  36. public:  
  37.     Observer(Account *account):account(account) {}  
  38.     virtual void handle_event()=0;  
  39.     virtual void set_account_balance(double balance)=0;  
  40.     virtual ~Observer()  
  41.     {  
  42.         cout<<"in the destructor of Observer"<<endl;  
  43.     }  
  44. };  
  45.   
  46. //BankAccount具体类,继承了ACcount抽象类  
  47. class BankAccount:public Account  
  48. {  
  49. public:  
  50.   
  51.     ~BankAccount()  
  52.     {  
  53.         cout<<"in the destructor of BankAccount"<<endl;  
  54.     }  
  55.   
  56. public:  
  57.     void add_observer(Observer *o)  
  58.     {  
  59.         observer.push_back(o);  
  60.     }  
  61.     void remove_observer(Observer *o)  
  62.     {  
  63.         for(vector<Observer*>::iterator it=observer.begin(); it!=observer.end(); it++)  
  64.         {  
  65.             if(o==*it)  
  66.             {  
  67.                 observer.erase(it);  
  68.                 return;  
  69.             }  
  70.         }  
  71.     }  
  72.     void notify_observer()  
  73.     {  
  74.         for(vector<Observer*>::const_iterator it=observer.begin(); it!=observer.end(); it++)  
  75.         {  
  76.             (*it)->handle_event();  
  77.         }  
  78.     }  
  79.     void set_balance(double balance)  
  80.     {  
  81.         this->balance=balance;  
  82.         notify_observer();  
  83.     }  
  84.     double get_balance()  
  85.     {  
  86.         return balance;  
  87.     }  
  88.   
  89. };  
  90.   
  91. class ATM:public Observer  
  92. {  
  93. public:  
  94.     ATM(Account *account):Observer(account)//将acount传递给基类Observer的构造函数  
  95.     {  
  96.     }  
  97.     ~ATM()  
  98.     {  
  99.         cout<<"in the destructor of ATM"<<endl;  
  100.     }  
  101. public:  
  102.     void handle_event()  
  103.     {  
  104.         cout<<"ATM: the balance of bank accont is changed to "<<account->get_balance()<<endl;  
  105.     }  
  106.     void set_account_balance(double balance)  
  107.     {  
  108.         account->set_balance(balance);  
  109.     }  
  110. };  
  111.   
  112. class InternetBankService:public Observer  
  113. {  
  114. public:  
  115.     InternetBankService(Account *account):Observer(account) {}  
  116.     ~InternetBankService()  
  117.     {  
  118.         cout<<"in the destructor InternetBankService "<<endl;  
  119.     }  
  120. public:  
  121.     void handle_event()  
  122.     {  
  123.         cout<<"IBS: the balance of bank account is changed to:"<<account->get_balance()<<endl;  
  124.     }  
  125.     void set_account_balance(double balance)  
  126.     {  
  127.         account->set_balance(balance);  
  128.     }  
  129.   
  130. };  


Observer.cpp

 

  1. #include "Observer.h"  
  2. int main(int argc, char **argv)  
  3. {  
  4.     Account *account=new BankAccount();  
  5.     Observer *atm_observer=new ATM(account);  
  6.     Observer *ibs_observer=new InternetBankService(account);  
  7.   
  8.     account->add_observer(atm_observer);  
  9.     account->add_observer(ibs_observer);  
  10.   
  11.     account->set_balance(1000.12);  
  12.   
  13.     cout<<"Event is triggered by atm_observer"<<endl;  
  14.     cout<<"============="<<endl;  
  15.     atm_observer->set_account_balance(1000.23);  
  16.   
  17.     cout<<"Event is triggered by ibs_observer"<<endl;  
  18.     cout<<"============="<<endl;  
  19.     ibs_observer->set_account_balance(1000.36);  
  20.   
  21.     delete atm_observer;  
  22.     delete ibs_observer;  
  23.     return 0;  
  24. }  

例2:

Test_Observer.cpp

  1. /* 
  2.     千万要注意对象分割问题的出现。一定要理解。 
  3. */  
  4. #include <iostream>  
  5. #include <string>  
  6. #include <vector>  
  7. using namespace std;  
  8.   
  9. class Observer  
  10. {  
  11. protected:  
  12.     string name;  
  13. public:  
  14.     virtual void update()  
  15.     {  
  16.         cout<<"Observer"<<endl;  
  17.     }  
  18. };  
  19.   
  20. class Man:public Observer  
  21. {  
  22. public:  
  23.     Man(string name)  
  24.     {  
  25.         this->name=name;  
  26.     }  
  27.     void update()  
  28.     {  
  29.         cout<<name<<" Man is coming"<<endl;  
  30.     }  
  31. };  
  32. class Woman:public Observer  
  33. {  
  34. public:  
  35.     Woman(string name)  
  36.     {  
  37.         this->name=name;  
  38.     }  
  39.     void update()  
  40.     {  
  41.         cout<<name<<" Woman is leaving"<<endl;  
  42.     }  
  43. };  
  44.   
  45. class Subject  
  46. {  
  47. private:  
  48.     vector<Observer*> obser;  
  49. public:  
  50.     void add(Observer &ob)  
  51.     {  
  52.         obser.push_back(&ob);  
  53.     }  
  54.     void notify()  
  55.     {  
  56.         for (vector<Observer*>::iterator it=obser.begin(); it!=obser.end(); it++)  
  57.         {  
  58.             (*it)->update();  
  59.         }  
  60.     }  
  61. };  
  62.   
  63. int main()  
  64. {  
  65.     Subject secret;  
  66.     Man m1("m1--");  
  67.     Man m2("m2--");  
  68.     Woman w1("w1");  
  69.     Woman w2("w2");  
  70.   
  71.     secret.add(m1);  
  72.     secret.add(m2);  
  73.     secret.add(w1);  
  74.     secret.add(w2);  
  75.   
  76.     secret.notify();  
  77.     return 0;  
  78.   
  79. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值