一个最简单的监听器实现

这里我们将演示如何实现一个最简单的监听器。

目的

1)通过最简单的例子来掩饰监听器模式的使用。

2)减少重复编码。

3)学习如何从简单到复杂的设计。

目标

1)扩展简单的监听器为更实用的复杂监听器。

2)不用每次都复制代码重新实现。

3)发现监听器模式可以被用在哪些地方。

4)发掘监听器的优势和劣势。

参与者

·   监听者

·   说话者

原理

说话者维护一个监听者列表来通知 监听者。

 

下面我们将通过伪代码描该实现。

1)我们首先后构建 ListenerListenerManager基类。

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- 改进监听器

 
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值