设计模式之观察者模式

//test2.h
#pragma once
#include <string>
#include <iostream>
#include <list>
using namespace std;

class Microsoft;
class Stock;
//观察者
class IObserver
{
public:
	  virtual void SendData(Stock* ms)=0;
};
class Investor : public IObserver
{
public:
	Investor()
	{}
	string _name;
	Investor(string name)
	{
		this->_name = name;
	}
	void SendData(Stock* ms);
	
};
class Mobile 
{

public:
	string _no;
	Mobile()
	{}
	Mobile(string No)
	{
		this->_no = No;
	}
	void SendData(Stock* ms);
};

//被观察者
class Stock
{
public:
	//IObserver* _investor;
	list<IObserver*> observers;
	string _symbol;
	double _price;
public:
	Stock()
	{}
	Stock(string symbol, double price)
	{
		this->_symbol = symbol;
		this->_price = price;
	}
	virtual void Update()
	{
		list<IObserver*>::iterator pos;
		for(pos=observers.begin(); pos != observers.end(); pos++)
		{
			(*pos)->SendData(this);
		}
		//_investor->SendData(*this);
	}
};
class Microsoft : public Stock
{
public:
	Microsoft(string symbol, double price): Stock(symbol, price)
	{
		
	}
};

//test2.cpp
#include "StdAfx.h"
#include "Test2.h"


void Investor::SendData(Stock* ms)
{
	cout<<_name<<" "<<ms->_symbol<<" "<<ms->_price<<endl;
}
void Mobile::SendData(Stock* ms)
{
	cout<<_no<<" "<<ms->_symbol<<" "<<ms->_price<<endl;
}
int main()
{
	list<A> a;
	A* a1 = new A();
	a.push_back(*a1);
	IObserver* investor = new Investor("Jom");
	IObserver* investor1 = new Investor("Jom1");
	IObserver* investor2 = new Investor("Jom2");
	Stock* ms = new Microsoft("Microsoft", 120);
	ms->observers.push_back(investor);
	ms->observers.push_back(investor1);
	ms->observers.push_back(investor2);
	/*ms->_symbol = "Microsoft";
	ms->_price = 120.0;*/
	ms->Update();
}


//总结

一:观察者Observer

观察者的设计意图和作用是 它将对象与对象之间创建一种依赖关系,当其中一个对象发生变化时,它会将这个变化通知给与其创建关系的对象中,实现自动化的通知更新

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。

// 被观察对象目标类
 
Class Subject
 
{
 
       // 对本目标绑定一个观察者 Attach( Observer );
 
       // 解除一个观察者的绑定   DeleteAttach( Observer );
 
       // 本目标发生改变了,通知所有的观察者,但没有传递改动了什么
 
       Notity()
 
       {
 
              For ( …遍历整个ObserverList …)
 
              { pObserver ->Update(); }
 
       }
 
// 对观察者暴露的接口,让观察者可获得本类有什么变动GetState();
 
}
 
//-------------------------------------------------------------------------------------------------------
 
// 观察者/监听者类
 
Class Observer
 
{
 
       // 暴露给对象目标类的函数,当监听的对象发生了变动,则它会调用本函数通知观察者
 
       Void Update ()
 
       {
 
              pSubject ->GetState();  // 获取监听对象发生了什么变化
 
              TODO:DisposeFun();  // 根据状态不同,给予不同的处理
 
       }
 
}
 
//-------------------------------------------------------------------------------------------------------
 
 



 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值