首页 / 软件开发 / C++ / 设计模式之观察者(Observer)模式与其C++通用实现(中)
设计模式之观察者(Observer)模式与其C++通用实现(中)2010-09-14 CSDN博客 林石通过上篇的介绍我们知道了观察者模式的基本特点、使用场合以及如何以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_;
};