观察者模式

观察者模式:

        定义了对象间一对多的联系。当一个对象的状态发生变化时,所有与它有联系的观察者对象都会得到通知。观察者模式将被观察的目标和观察者解耦,一个目标可以有任意多的观察者,观察者也可以观察任意多的目标,构成复杂的联系,而每个观察者都不知道其他观察者的存在。

意图:

        被观察者属性发生变化,各个观察者相应改变。

角色及职责:

    抽象被观察者(Subject):存储观察者对象,并且提供增加、删除、通知观察者德函数接口。

    被观察者(Concrete Subject):实现基类增加、删除、通知函数,并且在自身特定数据发生变化时,调用通知函数,通知观察者。

    抽象观察者(Observer):存储观察对象,提供被观察者发生变化时接收通数。

    观察者(Concrete Observer):实现接收函数。

特点:

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

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

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

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

典型例子:气候卫星

        当大气环流发生变化的时候,气候卫星数据发生改变,应该通知地面 气象台更新数据。

 

示例代码

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

#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);
	}

};


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值