设计模式专题--观察者模式

一、前言

    在日常的写代码中,观察者模式是很常见的一种模式,例如:在写入或者拷贝一个比较大的文件的过程中,我们常常需要知道进度是怎么样的。这样我们就希望有一些代码能够去实现这样的功能,观察者模式就诞生了。

二、模式介绍

    观察者模式,主要是由两个类进行实现。

  • 观察者类:主要负责接收被观察者发出的消息。进行相关的数据处理,消息提醒。
  • 被观察者类:提供观察者的注册、注销、通知观察者。

    看到两个类的职责我们就会发现实现起来很简单。

三、具体代码实现分析

#ifndef OBSERVER_H
#define OBSERVER_H

/*****************************************************
 * 观察者模式
 * Copyright (C) 2020 sinan Inc.
 *
 * This file is a design pattern.
 *
 * @file     observer.h
 * @brief    观察者模式
 * @author   sinan
 * @date     2020/03/03
 * @license  GNU General Public License (GPL)
 *
 * Remark :
 *
 * ***************************************************/

#include <iostream>
#include <set>

/**
 * @brief The Notify class
 * 消息事件
 * 提供两个参数:
 * Type:事件的类型
 * data:事件的数据
 */
class Notify
{
public:
    /**
     * @brief The Type enum
     * 消息类型
     */
    enum Type {
        None,
        Int,
        Float,
        Double,
        Str,
        User
    };
    Notify(Type type);
    Notify(Type type, void *data);
    virtual ~Notify();
    /// 消息的类型
    inline Type type() const { return static_cast<Type>(t); }
    /// 获取消息的数据
    inline void *data() const { return m_pData; }
protected:
    int  t;
    void *m_pData;
};

/**
 * @brief The Observer class
 * 观察者基类
 * 接收被观察者的事件消息
 * 需要实现虚函数:void receiveNotify()
 */
class Observer
{
public:
    Observer();
    virtual ~Observer();
    /// 接收被观察者消息虚函数
    virtual void receiveNotify(Notify *notify = NULL) = 0;
};

/**
 * @brief The Subject class
 * 被观察者基类
 * 发送事件到观察者中
 */
class Subject
{
public:
    Subject();
    virtual ~Subject();
    /// 注册观察者
    void attachObserver(Observer *obs);
    /// 注销观察者
    void detachObserver(Observer *obs);
    /// 清空观察者
    void clearObserver();
    /// 通知消息到观察者
    void notify(Notify *notify = NULL);
    /// 获取观察者的个数
    int  getObserverCount();
private:
    std::set<Observer *> m_setObs;
};

#endif // OBSERVER_H
#include "observer.h"

//@class Notify///
Notify::Notify(Type type) :
    t(type)
{}

Notify::Notify(Type type, void *data) :
    t(type),
    m_pData(data)
{}

Notify::~Notify()
{}

//@class Observer///
Observer::Observer()
{}

Observer::~Observer()
{}

//@class Subject///
Subject::Subject()
{}

Subject::~Subject()
{
    m_setObs.clear();
}

void Subject::attachObserver(Observer *obs)
{
    if (obs) {
        m_setObs.insert(obs);
    }
}

void Subject::detachObserver(Observer *obs)
{
    m_setObs.erase(obs);
}

void Subject::clearObserver()
{
    m_setObs.clear();
}

void Subject::notify(Notify *notify)
{
    std::set<Observer *>::iterator it = m_setObs.begin();
    for (; it != m_setObs.end(); it++) {
        if (*it) {
            (*it)->receiveNotify(notify);
        }
    }
}

int  Subject::getObserverCount()
{
    return m_setObs.size();
}

具体的函数说明,以及实现都在源码中

四、总结

    对设计模式的实现进行总结,以后有使用到相关的设计模式,会持续更新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值