现在的位置: 首页 > 综合 > 正文

观察者模式及c++实现 .

2017年01月22日 ⁄ 综合 ⁄ 共 4152字 ⁄ 字号 评论关闭

转自: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

/*
	观察者模式:在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,
	依赖它的对象都会收到通知,并自动更新。
*/

#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

  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. }  

抱歉!评论已关闭.