C++实现Behavioral - Observer模式 (转)

转http://patmusing.blog.163.com/blog/static/13583496020101501923571/ios

 

也称为Dependents或Publish-Subscribe模式。设计模式

 

定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,全部依赖于它的对象都获得通知并自动更新。分布式

“Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.” – GoF函数

 

将一个系统分解成一系列的相互协做的类会产生一个广泛存在的反作用:须要维护相关对象之间的一致性。要维护各对象之间的一致性,一般的作法就是使这些对象之间彼此紧耦合,可是这样又会下降他们的可重用性。工具

 

好比,许多图形界面工具包将用户界面的展现和底层应用数据分开。用来定义应用数据和界面展现的类能够独立重复使用,也能够一块儿使用。表格对象和柱状图对象能够同时展现同一个应用数据对象中的数据,但表格对象和柱状图对象,彼此无需知道对方的存在。但实际状况中,它们却彷佛又知道对方的存在,好比当一个用户改动表格中的信息,柱状图也会随之改变,反之亦然。this

 

22. C++实现Behavioral - Observer模式 - 玄机逸士 - 玄机逸士博客

这种行为暗示了表格对象和柱状图对象都依赖了数据对象。若是一个用户改变了表格中的数据,这种改动会当即被反映到数据对象中,数据对象中的数据发生了这种改变,会当即通知柱状图对象,柱状图对象获得通知后,会对柱状图的显示作出相应的改变。spa

 

Observer模式描述如何创建这些关系。本模式中的关键对象是Subject和Observer。一个Subject能够有任意多独立的Observer。若是Subject的内容发生改变,全部的Observer都会获得通知,每一个Observer则查询Subject,以保持与其状态同步。.net

 

这种交互也称为publish-subscribe(发布者-注册)。Subject就是publisher,任意数量的Observer能够注册以接收通知。设计

 

UML类图:指针

 

22. C++实现Behavioral - Observer模式 - 玄机逸士 - 玄机逸士博客 

 

业务案例:

 

22. C++实现Behavioral - Observer模式 - 玄机逸士 - 玄机逸士博客

说明:

-          经过ATM、InternetBankingService和MobileBankingService都可改动银行帐户余额;

-          银行帐户余额还能够有其余方式改变,好比柜台(此例并未用及,用来模拟银行帐户自身的余额变化);

-          只要一上其中之一改变了银行帐户中的余额,其余相关各方都可以收到余额变更信息;

-          Bank Account是Subject,ATM、InternetBankingService和MobileBankingService是Observer。

 

C++实现上述业务案例的代码以下:

// Observer.h

#include <iostream>

#include <vector>

 

using namespace std;

 

class Observer;

 

//Account抽象类,用作接口

class Account

{

protected:

         vector<Observer *> observers;                                      // 保存若干个Observer

         double balance;                                                                // 帐户余额

 

public:

         virtual void add_observer(Observer *o) = 0;                // 注册一个Observer

         virtual void remove_observer(Observer *o) = 0;         // 删除一个Observer

         virtual void notify_observer() = 0;                                   // 通知全部注册了的Observer

         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;

         }

};

 

// BankAccout具体类,继承Account抽象类

class BankAccount : public Account

{

public:

         ~BankAccount()

         {

                   cout << "in the destructor of BankAccount..." << endl;

         }

 

public:

         void add_observer(Observer *o)

         {

                   observers.push_back(o);

         }

 

         void remove_observer(Observer *o)

         {

                   for(vector<Observer *>::iterator it = observers.begin(); it != observers.end(); it++)

                   {

                            if(o == *it)                             // 注意*it就是observers中的元素,其类型为Observer *

                            {

                                     observers.erase(it);  // 这里须要注意,o从observers中被删除,但并未从内存中删除

                                     return;

                            }

                   }

         }

 

         void notify_observer()                                    // 向observers中的全部Observer发出通知,并进行相关处理

         {

                   for(vector<Observer *>::const_iterator it = observers.begin(); it != observers.end(); it++)

                   {

                            (*it)->handle_event();

                   }

         }

 

         void set_balance(double balance)

         {

                   this->balance = balance;

                   notify_observer();                                  // 只要余额变更,就向全部注册了的Observer发出通知

         }

 

         double get_balance()

         {

                   return balance;

         }

};

 

class ATM : public Observer

{

public:

         ATM(Account *account):Observer(account)                          // 将account传递给基类Observer的构造函数

         {

         }

 

         ~ATM()

         {

                   cout << "in the destructor of Observer..." << endl;

         }

 

public:

         void handle_event()

         {

                   cout << "ATM: The balance of bank account is changed to: " << account->get_balance() << endl;

         }

 

         void set_account_balance(double balance)                        // 在ATM中改动银行帐户余额,好比在ATM机上存取款

         {

                   account->set_balance(balance);

         }

};

 

class InternetBankingService : public Observer

{

public:

         InternetBankingService(Account *account):Observer(account)     // 将account传递给基类Observer的构造函数

         {

         }

 

         ~InternetBankingService()

         {

                   cout << "in the destructor InternetBankingService..." << 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);

         }

};

 

class MobileBankingService : public Observer

{

public:

         MobileBankingService(Account *account):Observer(account)          // 将account传递给基类Observer的构造函数

         {

         }

 

         ~MobileBankingService()

         {

                   cout << "in the destructor of MobileBankingService..." << endl;

         }

 

public:

         void handle_event()

         {

                   cout << "MBS: 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 InternetBankingService(account);

         Observer *mbs_observer = new MobileBankingService(account);

 

         // 注册Observer

         account->add_observer(atm_observer);

         account->add_observer(ibs_observer);

         account->add_observer(mbs_observer);

         // 银行帐户余额变更(好比在柜台存取款)

         account->set_balance(1000.12);

 

         // ATM机触发银行帐户余额变更

         cout << "\nEvent triggered by atm_observer: " << endl;

         cout << "================================" << endl;

         atm_observer->set_account_balance(1000.23);

 

         // 网上银行触发银行帐户余额变更

         cout << "\nEvent triggered by ibs_observer: " << endl;

         cout << "================================" << endl;

         ibs_observer->set_account_balance(1000.36);

 

         // 手机银行触发银行帐户余额变更

         cout << "\nEvent triggered by mbs_observer: " << endl;

         cout << "================================" << endl;

         mbs_observer->set_account_balance(1000.68);

 

         // 删除(unsubscribe)网上银行Observer,并变更银行帐户余额

         cout << "\nRemove ibs_observer: " << endl;

         cout << "====================" << endl;

         account->remove_observer(ibs_observer);

         account->set_balance(2000.23);

 

         cout << "\nDestroy all dynamically created objects: " << endl;

         cout << "========================================" << endl;

         delete account;

         delete atm_observer;

         delete ibs_observer;

         delete mbs_observer;

}

 

运行结果:

ATM: The balance of bank account is changed to: 1000.12

IBS: The balance of bank account is changed to: 1000.12

MBS: The balance of bank account is changed to: 1000.12

 

Event triggered by atm_observer:

================================

ATM: The balance of bank account is changed to: 1000.23

IBS: The balance of bank account is changed to: 1000.23

MBS: The balance of bank account is changed to: 1000.23

 

Event triggered by ibs_observer:

================================

ATM: The balance of bank account is changed to: 1000.36

IBS: The balance of bank account is changed to: 1000.36

MBS: The balance of bank account is changed to: 1000.36

 

Event triggered by mbs_observer:

================================

ATM: The balance of bank account is changed to: 1000.68

IBS: The balance of bank account is changed to: 1000.68

MBS: The balance of bank account is changed to: 1000.68

 

Remove ibs_observer:

====================

ATM: The balance of bank account is changed to: 2000.23

MBS: The balance of bank account is changed to: 2000.23

 

Destroy all dynamically created objects:

========================================

in the destructor of BankAccount...

in the destructor of Account...

in the destructor of Observer...

in the destructor of Observer...

in the destructor InternetBankingService...

in the destructor of Observer...

in the destructor of MobileBankingService...

in the destructor of Observer...

 

 

Observer设计模式和Mediator设计模式的主要区别

Observer设计模式:某个特定的对象(subject或者observable)的状态发生改变时,其余对象(observers)将作出相应的反应。

Mediator设计模式:任何对象的状态发生变化,其余对象都将作出相应的反应,中间是经过Mediator来进行协调的。

 

Observer设计模式有一个实际意义上的“中心”。Mediator设计模式没有实际意义上的中心,相对而言更分布式一些,其逻辑上的中心是因为纯设计上的须要而引入的“Mediator”,即Observer模式中,事件源在subject或observable对象;在Mediator模式中,事件源在除Mediator以外的其余全部对象。

 

关于在STL容器中保存对象指针的状况,详见:

http://patmusing.blog.163.com/blog/static/13583496020101831514657/

相关文章
相关标签/搜索