Welcome

首页 / 软件开发 / C++ / 设计模式之观察者(Observer)模式与其C++通用实现(下)

设计模式之观察者(Observer)模式与其C++通用实现(下)2010-09-14 CSDN博客 林石我们在《设计模式之观察者(Observer)模式与其C++通用实现(中)》一文中给出了一个以C++语言实现的通用观察者模式方案骨架。然而,实际的工程项目需求往往要比理想状态复杂得多,此篇便是与读者一起探讨在现实世界中可能遇到的各种棘手问题及解决方案。

我把目前为止我所遇到的问题罗列如下:

复合主题

多线程

更新方法修改观察者链表

接下来我们一一给予讨论。

(一)复合主题

考虑GUI的组件设计,我习惯用Widget类代表之,它需要处理许多用户交互以及系统事件,其中最常见的用户交互事件有鼠标及键盘事件。倘若架构师决定以事件监听方式设计整个UI框架,那么Widget便具有主题的角色,相应的,鼠标及键盘事件便是观察者角色。实际上,一个主题对应多种(不是多个)观察者的现象很普遍。

我们借助中篇所给的观察者模式骨架实现这类应用。

借助多继承机制,很容易办到:

01.struct MouseListener {
02.void mouseMoved(int x, int y) {}
03.};
04.
05.struct KeyListener {
06.void keyPressed(int keyCode) {}
07.};
08.
09.class Widget : public BasicSubject<MouseListener>, public BasicSubject<KeyListener>{...};
添加事件监听器的伪代码大致如下:

01.MouseListener mel;
02.KeyListener kel;
03.Widget w;
04.w.addObserver(mel);
05.w.addObserver(kel);