读书人

观察者模式-C++兑现

发布时间: 2012-12-29 10:28:09 作者: rapoo

观察者模式-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图

观察者模式-C++兑现

特点:

1.观察者模式定义了对象之间一对多的关系。

2.主题(也就是可观察者)用一个共同的接口来更新观察者。

3.观察者和可观察者用松耦合的方式结合,可观察者不知道观察者的细节,只知道观察者实现了观察者接口

4.有多个观察者时,不可以依赖特点的通知次序。

C++源代码:

Observer.h

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


Observer.cpp

[cpp] view plaincopyprint?
  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. account->add_observer(atm_observer);
  8. account->add_observer(ibs_observer);
  9. account->set_balance(1000.12);
  10. cout<<"Event is triggered by atm_observer"<<endl;
  11. cout<<"============="<<endl;
  12. atm_observer->set_account_balance(1000.23);
  13. cout<<"Event is triggered by ibs_observer"<<endl;
  14. cout<<"============="<<endl;
  15. ibs_observer->set_account_balance(1000.36);
  16. delete atm_observer;
  17. delete ibs_observer;
  18. return 0;
  19. }

例2:

Test_Observer.cpp

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

读书人网 >C++

热点推荐