您的位置:首页 > 其它

设计模式 Design Parttern ——观察者模式Observer

2010-10-23 22:45 330 查看
设计模式 Design Parttern ——观察者模式Observer
http://blog.csdn.net/leeidea

1:头文件

#ifndef _OBSERVER_H_VANEY_
#define _OBSERVER_H_VANEY_

#include <iostream>
using namespace std;
/******************************************************************
名称  :Observer.h
版本  :1.00
描述  :演示观察者模式的概念
作者  :vaney.li@gmail.com http://blog.csdn.net/leeidea 日期  :2010年10月23日
版权  :vaney.li@gmail.com http://blog.csdn.net/leeide ******************************************************************/

/*
官方解释:The Observer defines a one to many relationship, so that when one object
changes state, the others are notified and updated automatically.

我的理解:一个事务的变动会影响很多的其他事情

我的应用:广播,股市波动

*/
//抽象炒股者

class CStock;
class CObserver
{
public:
CObserver()
{
cout << "CObserver()" << endl;
}
virtual ~CObserver()
{
cout << "~CObserver()" << endl;
}

public:

//需要子类实现的方法
virtual void SellOrBuy(CStock* stock) = 0;
};

//股票
#define NUM_OBJECT 10
class CStock
{

int _count;
//股票价格
int _price;
CObserver* object[NUM_OBJECT];
public:
CStock():_count(0),_price(0)
{
for(int i = 0; i < NUM_OBJECT; i++)
{
object[i] = 0;
}
cout << "CStock()" << endl;
}
virtual ~CStock()
{

for(int i = 0; i < _count; i++)
{
if(object[i])
delete object[i];
object[i] = 0;
}
_count = 0;
cout << "~CStock()" << endl;
}

public:

virtual void Resigter(CObserver* ob)
{
if(_count < NUM_OBJECT && ob)
{
object[_count++] = ob;
}
}
//需要子类实现的方法
virtual void Notify()
{
for(int i = 0; i < _count; i++)
{
if(object[i])
object[i]->SellOrBuy(this);
}
}
public:
void SetPrice(int price)
{
_price = price;
}
int GetPrice()
{
return _price;
}

};

//机构
class CObserverCompany : public CObserver
{
public:
CObserverCompany()
{
cout << "CObserverCompany()" << endl;
}
virtual ~CObserverCompany()
{
cout << "~CObserverCompany()" << endl;
}

public:

//需要子类实现的方法
virtual void SellOrBuy(CStock* stock)
{
if(100 > stock->GetPrice())
{
cout << "Company sell" << endl;
}
else
{
cout << "Company buy" << endl;
}
}
};

//散户
class CObserverPerson : public CObserver
{
public:
CObserverPerson()
{
cout << "CObserverPerson()" << endl;
}
virtual ~CObserverPerson()
{
cout << "~CObserverPerson()" << endl;
}

public:

//需要子类实现的方法
virtual void SellOrBuy(CStock* stock)
{
if(10 > stock->GetPrice())
{
cout << "Person sell" << endl;
}
else
{
cout << "Person buy" << endl;
}
}
};

//操盘手

class CBoss
{
CStock* _stock;
public:
CBoss(CStock* stock):_stock(stock)
{
cout << "CBoss()" << endl;
}
virtual ~CBoss()
{
cout << "~CBoss()" << endl;
}

public:

virtual void ChangePrice(int price)
{
if(_stock)
_stock->SetPrice(price);
}
};
#define  C_API  extern "C"
//用户
C_API int UsingOB();
#endif

2:源文件

#include "Observer.h"
C_API int UsingOB()
{
//创建股民,机构即观察者
CObserverCompany* company = new CObserverCompany();
CObserverPerson*  person  = new CObserverPerson();

//创建股票,即观察者需要观察的东西
CStock* stock = new CStock();
//创建改变股价的操盘手
CBoss* boss = new CBoss(stock);

//关联
stock->Resigter(company);
stock->Resigter(person);

boss->ChangePrice(100);
//通知所有的股民,机构
stock->Notify();

boss->ChangePrice(5);
stock->Notify();

return 1;
}

3:用户文件main.c

extern int UsingOB();

//系统默认入口
int _tmain(int argc, _TCHAR* argv[])
{

return UsingOB();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: