观察者模式
动机: 在软件构建过程中,我们需要为某些对象建立一种"通知依赖关系",一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。 如果这样的依赖关系过于紧密,将使软件不能很好的抵御变化。 使用面向对象技术,可以将这种依赖关系落化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。
观察者(Observer)模式中包含两种对象,分别是目标对象和观察者对象。在目标对象和观察者对象间存在着一种一对多的对应关系,当这个目标对象的状态发生变化时,所有依赖于它的观察者对象都会得到通知并执行它们各自特有的行为。
//定义一个虚接口,让观察者继承。 class IProgress{ public: virtual void DoProgress(float value) = 0; ~IProgress(){} };
//观察者,如窗口类 实现虚接口 class MainFrom : public From, public IProgress() { //... ProGressBar * progressBar; //进度条 //... public: virtual void DoProgress(float value) { progressBar->setValue(value); } void Button_click() { // 执行业务并通知窗口更新进度 FileSplitter * fSplitter = new FileSplitter(filepath, this); fSplitter->split(); } }
// 业务类 class FileSplitter{ string m_filePath; IProgress *m_iprogress; //抽象通知机制,一个观察者 List<IProgress *> m_iprogressList; //多个观察者 public: FileSplitter(const string& filepath, IProgress *iprogress): m_filePath(filepath), m_iprogress(iprogress) { } void addIprogress(IProgress *pIprogress) { m_iprogressList.push_back(pIprogress); } void split(){ //... for(int i=0; i<size; i++) { if(m_iprogress) m_iprogress->DoProgress((i + 1)/size); } //... } }