1.动机
在软件构建的过程中,我们需要为某些对象建立一种"通知依赖关系"------------一个对象的状态发送改变,所有依赖对象都将得到通知。如果者样的依赖关系过于精密,将使软件不能很好地抵御变化。
Observer.hpp
//入口类
class MainForm : public Form,public IPorgress
{
TextBox *txtFilePath;
TextBox *txtFileNumber;
ProgressBar *progressBar;
public:
void button_Click()
{
string filePath = txtFilePath->getText();
int number = atoi(txtFileNumber->getText());
FileSplitter splitter(filePath,number);
ConsoleNotifier cn;
splitter.dd_IPorgressList(this); //添加观察者
splitter.dd_IPorgressList(&cn); //添加观察者
splitter.split();
splitter.remove_PorgressList(&cn); //删除观察者
}
virtual void DoProgress(float value)
{
progressBar->setValue(value);
}
};
//观察者
class ConsoleNotifier :public IPorgress
{
virtual void DoProgress(float value)
{
progressBar->setValue(value);
}
}
//抽象的通知基类
class IPorgress
{
public:
virtual void DoProgress(float value) = 0;
virtual ~IPorgress();
};
//稳定类 当需要添加观察者时,这个类不用改变
class FileSplitter
{
string m_filePath;
int m_number;
List<IPorgress*> m_IPorgressList; //抽象的通知机制 通知多个观察者
public:
FileSplitter(string filePath,int number):
m_filePath(filePath),
m_number(number)
{}
void sqlit()
{
//·····
for(int i=0;i<number;i++)
{
onPorgress(number/i);
}
}
void add_IPorgressList(IPorgress* iporgress) //添加观察者接口
{
m_IPorgressList.add(iporgress);
}
void remove_PorgressList(IPorgress* iporgress) //删除观察者接口
{
m_IPorgressList.remove(iporgress);
}
protected:
virtual void onPorgress(float value) //通知观察者
{
for(auto it = m_IPorgressList.begin();it !=m_IPorgressList.end(),it++)
{
it->DoProgress(value);//通知每一个观察者
}
}
}