一、实验内容
利用观察者模式实现股票信息的接收。实例说明:某在线股票软件需要提供以下功能:当股票购买者所购买的某只股票的变化幅度达到5%时,系统将自动发送通知(包括新价格)给购买该股票的股民。现使用观察者模式设计该系统,会之类涂并变成模拟实现。
二.设计类图
设计思路:
- 股票是目标类
- 股民是抽象观察者
- 具体人是具体的观察者
- 须在目标类中注册观察者
三、类具体代码(要求有相关注释)
#include<iostream>
#include<string>
#include<List>
#include<cmath>
using namespace std;
class Stock;
class ConcreteInvestor;
//抽象观察者
class Inverstor
{
public:
virtual void response(Stock stock) = 0 {}
};
//通知者类
class Stock
{
protected:
//股民列表
list<Inverstor*> investors ;
private:
string stockName;//股票名字
double price;//股票价格
public:
Stock(string stockName, double price)
{
stockName = stockName;
price = price;
investors = list<Inverstor*>();
}
//添加股民
void attach(Inverstor* inverstor)
{
investors.push_back(inverstor);
}
//获取股票名称
string getStockName()
{
return stockName;
}
//设置股票名称
void setStockName(string stockName)
{
stockName = stockName;
}
//重新设置股票价格
void setPrice(double price)
{
//range是股票的浮动率,当上下超过%5时就要给股民提示
double range = abs((price - this->price) / this->price);
this->price = price;
if (range >= 0.05)
{
this->notifyInverstor();//上下超过%5时就要给股民提示
}
}
//获取股票价格
double getPrice()
{
return (double)this->price;
}
//删除对应的股民信息
void detach(Inverstor* inverstor)
{
(investors).remove(inverstor);
}
void notifyInverstor()
{
list<Inverstor*>::iterator it = investors.begin();
for (; it != investors.end(); ++it)
{
(*it)->response(*this);
}
}
};
//具体观察者
class ConcreteInvestor :public Inverstor
{
private:
string name;
public:
ConcreteInvestor(string name)
{
name = name;
}
void response(Stock stock)
{
cout << "提示股民:" + name;
cout << "*****股票:" + stock.getStockName();
cout << "价格波动幅度超过5% ";
printf( "新价格是:%lf\n" ,stock.getPrice());
}
};
int main()
{
Stock haier = Stock("腾讯控股", 20.00);
Inverstor* inverstor1 = new ConcreteInvestor("张三");
Inverstor* inverstor2 = new ConcreteInvestor("李四");
haier.attach(inverstor1);
haier.attach(inverstor2);
haier.setPrice(25.00);
}
四.运行结果截图
五.设计模式分析总结
(1)观察者模式定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新,观察着模式又叫做发布订阅模式,搜整每图模式、源-监听器模式或从属者模式。观察者模式是一种对象行为型模式。
(2)观察者模式包含四个角色:目标又称为主题,它是指被观察的对象;具体目标是白标类的子类,通常它包含有经常发生改变的数据,当它的状态发生改变时,向它的各个观索者发出通知;观察者将对观察目标的改变做出反应;在具体观察者中维护一个指向具体目标对象的引用,它存储具体观察者的有关状态,这些状态需要和具体目标的状态保持一致。
(3)观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个目标对象,当这个目标对象的状态发生变化时,会通知所有观察者对象,使它们能够自动更新。
(4)观察者模式的主要优点在于可以实现表示层和数据逻辑层的分离,并在观察目标和观察者之间建立一个抽象的耦合,支持广播通信;其主要缺点在于如果一个观察目标对象有很多直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间,而且如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
(5)观察者模式适用情况包括:一个抽象模型有两个方面,其中一个方面依赖于另一个方面;一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变;一个对象必须通知其他对象,而并不知道这些对象是谁;需要在系统中创建一个触发链。