监听者-观察者模式

     在C++模式设计中,常用的一种模式设计方法就是监听者-观察者模式。每个监听者对象都把自己理解的事件注册到一个中心事件处理注册库,接收到消息后,中心事件处理注册库会把该消息分发到每个监听者对象。

    下面是来自于c++ profressional中的代码:

首先是监听者类:

Listener.h 和Listener.cpp,这是一个监听者基类,该类中定义了消息处理的纯虚函数,代码如下:

#pragma once

class Listener{public:    Listener(void);    ~Listener(void);virtual void handleMessage(int inMessage) = 0; };

 

#include "Listener.h"

Listener::Listener(void){}

Listener::~Listener(void){}

派生的监听类是TestListener, 该类实现如下:

TestListener.h

#pragma once#include "listener.h"#include "EventRegistry.h"

class TestListener :public Listener{public:    TestListener(void);    ~TestListener(void);

void handleMessage(int inMessage);bool fMessage0Received;bool fUnknownMessageReceived;};

TestListener.cpp,该类在构造函数中,把自己及消息0注册到中心事件处理库。

#include "TestListener.h"

TestListener::TestListener(void){    fMessage0Received = false;    fUnknownMessageReceived = false;//订阅事件0    EventRegistry::registerListener(0, this);}

TestListener::~TestListener(void){}

void TestListener::handleMessage(int inMessage) {switch (inMessage)    {case 0:         fMessage0Received = true;break;default:        fUnknownMessageReceived = true;break;    }}

下面是事件注册类的实现,在该类中每增加一个监听者类,都会把该类的引用增加到一个map中,该类的实现代码如下:

EventRegistry.h和EventRegistry.cpp

#pragma once#include <vector>#include <map>#include <iostream>#include "Listener.h"using namespace std;

class EventRegistry{public:    EventRegistry(void);    ~EventRegistry(void);static void registerListener(int inMessage,  Listener* inListener);static void handleMessage(int inMessage);protected:static map<int, vector< Listener*> > sListenerMap;};

 

#include "EventRegistry.h"

//定义静态mapmap<int, vector< Listener*> > EventRegistry::sListenerMap;EventRegistry::EventRegistry(void){}

EventRegistry::~EventRegistry(void){}

void EventRegistry::registerListener(int inMessage, Listener* inListener){//注册监听器    sListenerMap[inMessage].push_back(inListener);}void EventRegistry::handleMessage(int inMessage){ // 查找指定消息,然后处理所有注册该消息的监听类if (sListenerMap.find(inMessage) == sListenerMap.end()) return;for (int i = 0; i < sListenerMap[inMessage].size(); i++) {        sListenerMap[inMessage].at(i)->handleMessage(inMessage);    }}

在main函数中,中心注册类接收到了消息0,1,2,然后分发注册的监听类,TestListener注册了消息0,可以通过fMessage0Received变量验证,它确实收到了消息0。

#include <stdio.h>#include <stdlib.h>#include <iostream>#include "EventRegistry.h"#include "Listener.h"#include "TestListener.h"

using namespace std;

int main(int argc, char* argv[]){

TestListener tt ;    EventRegistry::handleMessage(0);    EventRegistry::handleMessage(1);    EventRegistry::handleMessage(2);if (!tt.fMessage0Received) {        cout << "TEST FAILED: Message 0 was not received" << endl;    } else if (tt.fUnknownMessageReceived) {        cout << "TEST FAILED: TestListener received unknown message" << endl;    } else {        cout << "TEST PASSED" << endl;    }

return 0;}

源码下载:

http://files.cnblogs.com/mikewolf2002/WatchListener.zip

时间: 2024-09-26 06:50:57

监听者-观察者模式的相关文章

ios-kvo监听者模式,它需要用到哪几种设计模式?

问题描述 kvo监听者模式,它需要用到哪几种设计模式? 面试的时候面试官问的....................... 解决方案 observer模式 名字中就提到了 解决方案二: 你查到了吗,我也想知道有几种设计模式 解决方案三: 观察者模式.没有其他模式了.

请教https://username:password@hostname.com这种URL形式会导致监听者捕获账户信息么?

问题描述 这样的URL实际在访问过程中是否会把用户名和密码直接明文传输给服务器呢?监听者是否有可能捕获到密码? 解决方案 解决方案二:你好,ftp协议是不对数据包加密的,账号密码都是显式的,本地测试可抓取账号密码.测试软件:filezillaserverFTP服务器:192.168.66.41FTP客户端:192.168.66.70账号密码:test/test账号/密码抓包工具:wireshark解决方案三:不会.https的本质是HTTP+SSL,URL仅出现在HTTP协议的请求行,也就是说它

EntityFramework之监听者判断SQL性能指标

前言 当我们利用EF这个ORM框架时,我们可能会利用LINQ或者原生的SQL语句来进行数据操作,此时我们无法确定我们的代码是否会给数据库带来一定的负载,当给数据库带来一定的压力时,由于项目中对数据进行相应的操作实在是太多,我们无法准确的去进行定位,又或者我们不是专业的DBA,无法准确的去分析SQL性能的优劣,此时该怎么办呢?我们完全不需要DBA,我们可以通过相应的操作来判断一段SQL代码的好坏,这就是我们本节需要讲的内容,利用EF中监听者来判断SQL性能,在之前系列中也有提到,可以参考之前系列.

设计模式之观察者模式(关于OC中的KVO\KVC\NSNotification)

学习了这么久的设计模式方面的知识,最大的感触就是,设计模式不能脱离语言特性.近段时间所看的两本书籍,<大话设计模式>里面的代码是C#写的,有一些设计模式实现起来也是采用了C#的语言特性(C#的API,抽象类,在OC中是没有抽象类.没有多继承关系),<设计模式之禅>里面的代码是JAVA写的,与OC差距也是比较大. 但是我想,这些都不是问题,学习设计模式主要学习的是其中的思想,并将之改造成自己所熟悉语言的模式,大同小异.所需要注意的是,在学习的过程中,将之与语言结合起来,多思考.多实践

设计模式(二):自己动手使用“观察者模式”实现通知机制

在之前发布Objective-C系列博客的时候,其中提到过OC的通知机制,请参考<Objective-C中的老板是这样发通知的(Notification)>这篇博客.在之前关于Notification的博客中,只介绍了Foundation框架中的通知的使用方式.正如前面博客中提到的那样,通知是"一对多的关系",类似于广播.一个人发通知,多个人接收.这也就是设计模式中的"观察者模式".接收者的一方是Observer(观察者),而发送方是Subject(主题

Java设计模式开发中使用观察者模式的实例教程_java

观察者模式是软件设计模式中的一种,使用也比较普遍,尤其是在GUI编程中.关于设计模式的文章,网络上写的都比较多,而且很多文章写的也不错,虽然说有一种重复早轮子的嫌疑,但此轮子非彼轮子,侧重点不同,思路也不同,讲述方式也不近相同.关键要素 主题: 主题是观察者观察的对象,一个主题必须具备下面三个特征. 持有监听的观察者的引用 支持增加和删除观察者 主题状态改变,通知观察者 观察者: 当主题发生变化,收到通知进行具体的处理是观察者必须具备的特征. 为什么要用这种模式 这里举一个例子来说明,牛奶送奶站

设计模式:观察者模式(有利于代码解耦)

什么是ApplicationContext? 它是Spring的核心,Context我们通常解释为上下文环境,但是理解成容器会更好些. ApplicationContext则是应用的容器. Spring把Bean(object)放在容器中,需要用就通过get方法取出来.   ApplicationEvent 是个抽象类,里面只有一个构造函数和一个长整型的timestamp. ApplicationListener 是一个接口,里面只有一个onApplicationEvent方法. 所以自己的类在

如何使用 Java8 实现观察者模式?(上)

[编者按]本文作者是 BAE 系统公司的软件工程师 Justin Albano.在本篇文章中,作者通过在 Java8 环境下实现观察者模式的实例,进一步介绍了什么是观察者模式.专业化及其命名规则,供大家参考学习.本文系国内 ITOM 管理平台 OneAPM工程师编译整理. 观察者(Observer)模式又名发布-订阅(Publish/Subscribe)模式,是四人组(GoF,即 Erich Gamma.Richard Helm.Ralph Johnson 和 John Vlissides)在1

实例解析观察者模式及其在Java设计模式开发中的运用_java

一.观察者模式(Observer)的定义: 观察者模式又称为订阅-发布模式,在此模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知.这通常透过呼叫各观察者所提供的方法来实现.此种模式通常被用来事件处理系统. 1.观察者模式的一般结构 首先看下观察者模式的类图描述: 观察者模式的角色如下: Subject(抽象主题接口):定义了主题类中对观察者列表的一系列操作, 包括增加,删除, 通知等. Concrete Subject(具体主题类): Observer(抽象