观察者模式:
定义了对象间一对多的联系。当一个对象的状态发生变化时,所有与它有联系的观察者对象都会得到通知。观察者模式将被观察的目标和观察者解耦,一个目标可以有任意多的观察者,观察者也可以观察任意多的目标,构成复杂的联系,而每个观察者都不知道其他观察者的存在。
意图:
被观察者属性发生变化,各个观察者相应改变。
角色及职责:
抽象被观察者(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);
}
};