观察者模式

介绍

观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。

UML结构图

这里写图片描述

作用

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

实现

Observer.h

#ifndef OBSERVER_H
#define OBSERVER_H

#include <list>

typedef int STATE;

class Observer;

class Subject
{
public:
    Subject() :m_nSubjectState(-1) {}
    virtual ~Subject();

    void Notify();
    void Attach(Observer *pObserver);
    void Detach(Observer *pObserver);

    virtual void SetState(STATE nState);
    virtual STATE GetState();
protected:
    STATE m_nSubjectState;
    std::list<Observer*> m_ListObserver;
};

class Observer
{
public:
    Observer() :m_nObserverState(-1) {}
    virtual ~Observer() {}

    virtual void Update(Subject* pSubject) = 0;

protected:
    STATE m_nObserverState;
};


class ConcreateSubject:public Subject
{
public:
    ConcreateSubject() :Subject() {};
    virtual ~ConcreateSubject() {};

    virtual void SetState(STATE nState);
    virtual STATE GetState();
};

class ConcreateObserver:public Observer
{
public:
    ConcreateObserver() :Observer() {};
    virtual ~ConcreateObserver() {};

    virtual void Update(Subject* pSubject);

};

#endif

Observer.cpp

#include "Observer.h"
#include <iostream>
#include <algorithm>

/************Subject类成员函数的实现************/
void Subject::Attach(Observer *pObserver)
{
    std::cout << "添加一个观察者" << std::endl;
    m_ListObserver.push_back(pObserver);
}

void Subject::Detach(Observer *pObserver)
{
    std::list<Observer*>::iterator it;
    it = std::find(m_ListObserver.begin(), m_ListObserver.end(), pObserver);

    if (m_ListObserver.end() != it)
    {
        m_ListObserver.erase(it);
    }
    std::cout << "删除一个观察者" << std::endl;
}

void Subject::Notify()
{
    std::cout << "通知观察者状态改变" << std::endl;
    std::list<Observer*>::iterator it1, it2;

    for (it1=m_ListObserver.begin(),it2=m_ListObserver.end(); 
        it1!=it2; ++it1)
    {
        (*it1)->Update(this);
    }
}

void Subject::SetState(STATE nState)
{
    std::cout << "设置状态(Subject)" << std::endl;
    m_nSubjectState = nState;
}

STATE Subject::GetState()
{
    std::cout << "获取状态(Subject)" << std::endl;
    return m_nSubjectState;
}

Subject::~Subject()
{
    std::list<Observer*>::iterator it1, it2, temp;

    for (it1 = m_ListObserver.begin(), it2 = m_ListObserver.end();
    it1 != it2;)
    {
        temp = it1;
        ++it1;
        delete(*temp);
    }

    m_ListObserver.clear();
}

/************ConcreateSubject类成员函数的实现************/
STATE ConcreateSubject::GetState()
{
    std::cout << "获取状态(ConcreateSubject)" << std::endl;
    return m_nSubjectState;
}

void ConcreateSubject::SetState(STATE nState)
{
    std::cout << "设置状态(ConcreateSubject)" << std::endl;
    m_nSubjectState = nState;
}

/************ConcreateObserver类成员函数的实现************/
void ConcreateObserver::Update(Subject* pSubject)
{
    if (pSubject == NULL)
    {
        return;
    }

    m_nObserverState = pSubject->GetState();

    std::cout << "观察者的状态是:" << m_nObserverState << std::endl;
}

main

int main()
{
    Observer *p1 = new ConcreateObserver;
    Observer *p2 = new ConcreateObserver;

    Subject* p = new ConcreateSubject;
    p->Attach(p1);
    Sleep(2000);
    p->Attach(p2);
    Sleep(2000);
    p->SetState(4);
    Sleep(2000);
    p->Notify();
    Sleep(2000);

    p->Detach(p1);
    Sleep(2000);
    p->SetState(10);
    Sleep(2000);
    p->Notify();

    delete p;
    system("pause");
    return 0;
}

截图

这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值