一个最简单的监听器实现

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

目的

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

 
以下是一个简单的JavaScript代码示例,用于实现一个事件监听器Event类: ```javascript class Event { constructor() { this.listeners = {}; } on(eventName, callback) { if (!this.listeners[eventName]) { this.listeners[eventName] = []; } this.listeners[eventName].push(callback); } emit(eventName, data) { const eventListeners = this.listeners[eventName]; if (eventListeners) { eventListeners.forEach(callback => { callback(data); }); } } off(eventName, callback) { const eventListeners = this.listeners[eventName]; if (eventListeners) { this.listeners[eventName] = eventListeners.filter(cb => cb !== callback); } } } ``` 上述代码定义了一个Event类,具有以下方法: - `on(eventName, callback)`:将事件监听器添加到指定的事件名上。 - `emit(eventName, data)`:触发指定事件名的所有监听器,并传递数据给监听器回调函数。 - `off(eventName, callback)`:从指定事件名上移除指定的监听器。 你可以创建一个Event实例,并使用该实例的`on`方法添加监听器,然后使用`emit`方法触发事件,并且使用`off`方法移除不需要的监听器。 以下是一个使用示例: ```javascript const event = new Event(); // 添加事件监听器 event.on('click', data => { console.log('点击事件触发了:', data); }); event.on('hover', () => { console.log('鼠标悬停事件触发了'); }); // 触发事件 event.emit('click', '按钮'); event.emit('hover'); // 移除事件监听器 event.off('click'); ``` 这个示例中,我们创建了一个`event`实例并添加了两个事件监听器。然后,我们通过调用`emit`方法触发了两个事件,并传递了一些数据。最后,我们使用`off`方法移除了`click`事件的监听器
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值