<b>计划情势之察看者(Observer)情势与其C++通用实现(中)</b>[VC/C++编程]
本文“<b>计划情势之察看者(Observer)情势与其C++通用实现(中)</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
通过上篇的介绍我们知道了察看者情势的基本特点、利用场所以及若何故C++语言实现.有过多次编写察看者情势代码经验的你大概会发现,几近全部的案例存在为数相当可观的反复性代码:定义一个察看者接口;定义一个主题并实现其诸如注册一/多个察看者,移除一/多个察看者,广播至所注册的察看者等基本行为.既然如此,我们有没有大概为全部察看者情势抽象出共有的接口与行为,以便日后复用呢?
此篇文章就是探究若何实现一个通用或称为万能的察看者情势库.
我们为全部的察看者/定阅者抽象出一个共有的接口IObserver:
struct IObserver{
virtualvoidupdate()=0;
virtual~Observer(){}
};
当主题状况发生改变时IObserver对象的update办法会被自动调用.IObserver的子类会实现update办法,以便具有其特定的行为.考虑到update办法的具体实现,大部份情形下我们需求查询主题的状况,从而做出反映.这有多种实现筹划:一是生成全局或近似全局性(如Singleton技术)的主题对象:
Subjectg_subject;
...
structConcreteObserver:public IObjserver{
virtualvoidupdate(){
if(g_subject.getStatus()==xxx){
...
}
};
因为“尽大概的不要利用全局对象”来由,这种方法不常用.二是为update办法增添一个参数,以便奉告update某些必要的信息,为具有广泛性,我以
Event代表此类,定义以下:
struct Event{
Event(Subject &subject);
BasicSubject*getSubject();
virtual~Event(){}
};
很明显,这应当是个基类,所以具有需析构办法,此外,Event还供应一个获得主题的办法.BasicSubject类是我们随后要说到的主题基类.这样,IObserver接口的定义看起来应当是这样:
struct IObserver{
virtualvoidupdate(Event&event)=0;
virtual~IObserver(){}
};
接下来处理我们的主题,按照前面所提到的它应当具有的行为,它的定义应当大致像这样:
class BasicSubject{
public:
virtual ~BasicSubject() {}
voidaddObserver(IObserver&observer);
voidremoveObserver(IObserver&observer);
protected:
voidnotifyAll(Event&event);
protected:
std::list<Observer*>observers_;
};
以上是“<b>计划情势之察看者(Observer)情势与其C++通用实现(中)</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |