[设计模式]<9>. C++与观察者模式(observer pattern)

作者:默默地EEer

原文:http://www.cnblogs.com/hebaichuanyeah/p/6091694.html

意图: 定义对象间一对多的依赖关系,使得一个对象被改变,其他对象被更新。

java的事件机制就是一个观察者模式,当事件发生,所有的事件接收者执行事件响应函数。

实现观察者模式,首先需要定义一个"观察者类(observer)"接口,在该类里面定义一个纯虚的事件响应函数。

并且需要一个"目标类(subject)",该类里面包含一个Set/Map或者List容器。当某个继承自"观察者类(observer)"的对象需要监听事件时,则把它添加到"目标类(subject)"对象的容器里面,当事件发生时,则遍历容器,调用事件响应函数。之前有一次我需要在Qt中实现一个串口事件触发的机制,我所用的Qt4中并没有串口事件,所以我在一个线程里阻塞等待串口,并试图使用观察者模式来实现这个自定义事件机制。后来蛋疼的发现,在Qt如果在非main线程里面操作UI类会时不时把程序跑死……

所以,如果你使用的语言/类库里面有完善的事件机制,观察者模式就用不到了。例如C#里面的委托配合泛型使用,等同于观察者模式的效果。

一个栗子

#include <iostream>
#include <set>

using namespace std;

//观察者接口,包括事件响应函数
class Observer
{
public :
    virtual void update(int n)=0;
};

//目标类,负责触发事件
class Subject
{
public:
    Subject(){};
    //添加事件监听
    void addObserver(Observer *observer)
    {
        observerSet.insert(observer);
    }
    //删除事件监听
    void removeObserver(Observer *observer)
    {
        observerSet.erase(observer);
    }
    //触发事件
    void notify(int n)
    {
        set<Observer *>::iterator iter;
        for(iter = observerSet.begin() ; iter != observerSet.end() ; ++iter)
        {
            (*iter)->update(n);
           // iter.   ->update();
        }
    }

private:
    set<Observer *> observerSet;
};

class Observer1 :public Observer
{
public:
    void update(int n)
    {
        cout<<"观察者1事件响应函数,接受参数:"<<n<<endl;
    }

};
class Observer2 :public Observer
{
public:
    void update(int n)
    {
        cout<<"观察者2事件响应函数,接受参数:"<<n<<endl;
    }

};
main()
{
    Subject subject;
    Observer * observer1 = new   Observer1();
    Observer * observer2 = new   Observer2();
    subject.addObserver(observer1);
    subject.addObserver(observer2);
    subject.notify(4);
    subject.notify(1);

}

时间: 2024-11-08 12:49:38

[设计模式]<9>. C++与观察者模式(observer pattern)的相关文章

设计模式之二:观察者模式(Observer Pattern)

先看下观察者模式的定义: The Observer Pattern defines a one-to-many denpendency between objects so that when one object changes state, all of its dependents are notified and updated automatically.:观察者模式定义了对象间一对多依赖关系,使得当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新. 观察者模式又叫发布-

设计模式(行为型)之观察者模式(Observer Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(结构型)之代理模式(Proxy Pattern)>http://blog.csdn.net/yanbober/article/details/45480965 概述 观察者模式用于建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应作

设计模式 - 观察者模式(Observer Pattern) 详解

观察者模式(Observer Pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权所有, 禁止转载, 如有转载, 请站内联系. 观察者模式(Observer Pattern): 定义了对象之间的一对多的依赖, 这样一来, 当一个对象改变状态时, 它的所有依赖者都会收到通知并自动更新. 使用方法: 1. 首先新建主题(subject)接口, 负责注册(register)\删除(remove

设计模式 - 观察者模式(Observer Pattern) Java内置 使用方法

观察者模式(Observer Pattern) Java内置 使用方法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26601659 观察者模式(observer pattern)详解, 参见: http://blog.csdn.net/caroline_wendy/article/details/26583157 Java内置的观察者模式, 是通过继承父类, 实现观察者模式的几个主要函数: Observerable(可被观

Java设计模式之观察者模式(Observer Pattern)

Observer Pattern 是一种常用的设计模式,它是一种事件监听模型.该模式有两个角色,一个是Subject, 另一个是Observer.Subject 保存有多个Observer的引用,一旦特定的事件发生,Subject会通知它所有的Observer,Observer得到该通知后执行相关程序逻辑.其中,Observer只有先向Subject注册后才能被Subject知晓.这就像订报纸,只有我们向出版社提出订报的申请,出版社才会把我们列入订阅者名单,然后每当新报纸印好时,出版社会通知订阅

设计模式 - 观察者模式(Observer Pattern) 详细说明

观察者模式(Observer Pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部, 禁止转载, 如有转载, 请站内联系. 观察者模式(Observer Pattern): 定义了对象之间的一对多的依赖, 这样一来, 当一个对象改变状态时, 它的全部依赖者都会收到通知并自己主动更新. 用法: 1. 首先新建主题(subject)接口, 负责注冊(register)\删除(remo

jQuery中的观察者模式(Observer Pattern)

在jQuery中,on方法可以为元素绑定事件,trigger方法可以手动触发事件,围绕这2个方法,我们来体验jQuery中的观察者模式(Observer Pattern). ■ on方法绑定内置事件,自然触发 比如,我们给页面的body元素绑定一个click事件,这样写. <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title&

设计模式(二)The Observer Pattern 观察者模式

问题引入 生成一个公告板显示当时的天气状况,当天气状况发生改变的时候公告板能够实时的更新. 模式定义 定义对象之间的一对多的依赖.当一个对象改变状态时,它的全部依赖者都会自己主动收到通知并自己主动更新. 认识模式 该模式在生活中是非经常见的.想想生活中的各种各样的检測系统,报警系统,一旦有重要事件发生时,有关系统总能及时的收到通知.这就是观察者模式. 问题解决 关于观察者模式,java实际上给了我们内置的支持(能够看出该模式还是非经常常使用的吧!)可是我们经常会自己实现. 为什么呢?我们后面会给

【设计模式】观察者模式 Observer Pattern

定义:观察者模式定义了对象之间的一对多依赖.当“主题”(Object)状态改变事,所有依赖它的“观察者”(Observer)都会受到通知并自动更新.主题支持观察者订阅和退订. 观察者模式提供了一种对象设计,让主题和观察者之间松耦合.改变主题或观察者一方不会影响另一方.因为两者是松耦合的. 参考: 设计模式学习笔记--Observer Pattern观察者模式