//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(); // 根据状态不同,给予不同的处理
}
}
//-------------------------------------------------------------------------------------------------------