这里我们将演示如何实现一个最简单的监听器。
目的
1) 通过最简单的例子来掩饰监听器模式的使用。
2) 减少重复编码。
3) 学习如何从简单到复杂的设计。
目标
1) 扩展简单的监听器为更实用的复杂监听器。
2) 不用每次都复制代码重新实现。
3) 发现监听器模式可以被用在哪些地方。
4) 发掘监听器的优势和劣势。
参与者
· 监听者
· 说话者
原理
说话者维护一个监听者列表来通知 监听者。
下面我们将通过伪代码描该实现。
1) 我们首先后构建 Listener和ListenerManager基类。
2) 然后我们将做出具体的实现。
3) 最后我们将演示如何让说话者说话的时候通知监听者 【他说话了】。
class Listener
{
public:
Listener() {}
virtual ~Listener() {}
} ;
一个什么都不带的监听者基类。
template < typename T_listener >
class ListenerManager
... {
//! Typedef:
public:
// Typedefs to make declarations easier!
typedef std::vector<listener_type*> ListenerHolder;
//! Construction:
public:
ListenerManager();
virtual ~ListenerManager() ...{}
typedef T_listener listener_type;
//! Operations:
public:
void addListener(listener_type*);
listener_type* removeListener(listener_type*);
//! Implementation:
protected:
ListenerHolder mListenerHolder;
} ;
上面我们使用了模板实现监听管理器, 这样就避免了子类的类型转换。
实现你的具体说话监听者和说话者
class SpeakListener
{
//! Construction:
public:
SpeakListener() {}
virtual ~SpeakListener() {}
//! Operations:
public:
// 听到说了, 但是不知道说什么
virtual void onSpeak()
{
// 你听到话后做的事情...
}
} ;
对话监听者可以听到说话。
class Speaker : public ListenerManager < SpeakListener >
{
// 说话者说话了, 但是同样不知道说什么
virtual void speak()
{
FOR_EACH( ListenerHolder::const_iterator, it, mListenerHolder )
{
const SpeakListener* hearer= *it;
hearer->onSpeak();
}
}
};
说话者可以说话。
使用监听器
SpeakListener * a = new SpeakListener;
SpeakListener * b = new SpeakListener;
Speaker speaker;
// 为说话者添加监听者
speaker.addListener(a);
speaker.addListener(b);
// 说话, 监听者做出各自的反应
speaker.speak();
// 移除监听者
speaker.removeListener(a);
speaker.removeListener(b);
// 释放监听者
SafeDelete(a);
SafeDelete(b);
改进监听器
实现了最简单的监听器后下面我们可以逐步扩展这个实现, 并加入更多实用的设计和功能。
具体参见监听器模式的讨论2- 改进监听器。