zoukankan      html  css  js  c++  java
  • 观察者模式及c++实现

     观察者模式概念:定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,全部依赖于它的对象都得到通知并自己主动更新。“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

    /*
    	千万要注意对象切割问题的出现。一定要理解。
    */
    #include <iostream>
    #include <string>
    #include <vector>
    using namespace std;
    
    class Observer
    {
    protected:
    	string name;
    public:
    	virtual void update()
    	{
    		cout<<"Observer"<<endl;
    	}
    };
    
    class Man:public Observer
    {
    public:
    	Man(string name)
    	{
    		this->name=name;
    	}
    	void update()
    	{
    		cout<<name<<" Man is coming"<<endl;
    	}
    };
    class Woman:public Observer
    {
    public:
    	Woman(string name)
    	{
    		this->name=name;
    	}
    	void update()
    	{
    		cout<<name<<" Woman is leaving"<<endl;
    	}
    };
    
    class Subject
    {
    private:
    	vector<Observer*> obser;
    public:
    	void add(Observer &ob)
    	{
    		obser.push_back(&ob);
    	}
    	void notify()
    	{
    		for (vector<Observer*>::iterator it=obser.begin(); it!=obser.end(); it++)
    		{
    			(*it)->update();
    		}
    	}
    };
    
    int main()
    {
    	Subject secret;
    	Man m1("m1--");
    	Man m2("m2--");
    	Woman w1("w1");
    	Woman w2("w2");
    
    	secret.add(m1);
    	secret.add(m2);
    	secret.add(w1);
    	secret.add(w2);
    
    	secret.notify();
    	return 0;
    
    }



     

  • 相关阅读:
    边框的作用之产生相对margin
    css3 实现切换显示隐藏效果
    Vue 获取数据、事件对象、todolist
    Vue 双向数据绑定、事件介绍以及ref获取dom节点
    Vue 目录结构分析 数据绑定 绑定属性 循环渲染数据 数据渲染
    Vue 安装环境创建项目
    进程&线程
    生成Excel
    JQuery input file 上传图片
    0908期 HTML 样式表属性
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/3740722.html
Copyright © 2011-2022 走看看