c++設計模式之觀察者模式


觀察者模式
場景:
  多個觀察者觀察一個目標對象的狀態,若該目標對象狀態發生改變,則觀察者會對此作出反應
實現:
  目標對象:
  1.狀態變量
  2.觀察者列表
  3.attach成員函數用於向觀察者列表中添加觀察者
  4.detach成員函數,用於刪除觀察者列表中的觀察者成員
  5.notify函數,用於當狀態變量發生變化時,通知觀察者
  觀察者:
  1.觀察者應該有多個,所以最好應該有一個抽象類
  2.update成員函數,用於當目標對象狀態變量發生改變時,觀察者作出反應
優點:
  任何時候,只要狀態變量發生改變,觀察者立刻就能發生改變

//代碼
//object.h
#pragma once
#include <list>
#include "IObserver.h"


class object
{
public:
    object();
    ~object();
    void attach(IObserver* observer);
    void detach(IObserver* observer);
    void notify();
    void set_state(int state);
private:
    std::list<IObserver*> m_list;
    int m_state;
};

//object.cpp
#include "pch.h"
#include "object.h"


object::object():m_state(0)
{
}


object::~object()
{
}

void object::set_state(int state) 
{
    m_state = state;
}

void object::attach(IObserver* observer) 
{
    m_list.push_back(observer);
}

void object::detach(IObserver* observer) 
{
    m_list.remove(observer);
}

void object::notify()
{
    std::list<IObserver*>::iterator it = m_list.begin();
    for (;it!=m_list.end();it++)
    {
        (*it)->update(m_state);
    }
}

//IObserver.h
#pragma once
#include <iostream>
class IObserver
{
public:
    IObserver();
    ~IObserver();
    virtual void update(int state) = 0;
};

class ObserverA :public IObserver 
{
    void update(int state);
};

class ObserverB :public IObserver 
{
    void update(int state);
};

//IOberser.vpp
#include "pch.h"
#include "IObserver.h"


IObserver::IObserver()
{
}


IObserver::~IObserver()
{
}


void ObserverA::update(int state) 
{
    std::cout << "ObserverA:" << state << std::endl;
}


void ObserverB::update(int state)
{
    std::cout << "ObserverB:" << state << std::endl;
}

//測試代碼
#include "pch.h"
#include <iostream>
#include "IObserver.h"
#include "object.h"

#ifndef SAFE_DELETE_POINTER
#define SAFE_DELETE_POINTER(p){if(p) delete(p); (p)=NULL;}
#endif 


int main()
{
    object* v_object = new object;
    IObserver* observera = new ObserverA;
    IObserver* observerb = new ObserverB;

    v_object->set_state(23);

    v_object->attach(observera);
    v_object->attach(observerb);

    v_object->notify();

    v_object->detach(observera);
    v_object->detach(observerb);

    SAFE_DELETE_POINTER(v_object);
    SAFE_DELETE_POINTER(observera);
    SAFE_DELETE_POINTER(observerb);

    getchar();
}

運行結果:

ObserverA:23

ObserverB:23

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM