设计模式----观察者模式 实例

代码:

#include <iostream>  
#include <vector>  
using namespace std;  

class Account;

//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;    
  }  
};  


 
//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;  
    }  
};  
 

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





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;  


编译、运行结果:

ngnsvr9 [** NONE **]/home/xionghailong/demo/observer $ g++ main.cpp -o main
ngnsvr9 [** NONE **]/home/xionghailong/demo/observer $ ./main
ATM: the balance of bank accont is changed to 1000.12
IBS: the balance of bank account is changed to:1000.12
Event is triggered by atm_observer
=============
ATM: the balance of bank accont is changed to 1000.23
IBS: the balance of bank account is changed to:1000.23
Event is triggered by ibs_observer
=============
ATM: the balance of bank accont is changed to 1000.36
IBS: the balance of bank account is changed to:1000.36
in the destructor of ATM
in the destructor of Observer
in the destructor InternetBankService
in the destructor of Observer

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值