设计模式-行为-观察者
生活随笔
收集整理的這篇文章主要介紹了
设计模式-行为-观察者
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
#pragma once#ifndef OBSERVER_H #define OBSERVER_H
#include <list> typedef int STATE; class Observer; //發(fā)布者
// Subject 抽象基類,只需要知道Observer 基類的聲明就可以了
class Subject
{
public: Subject() : m_nSubjectState(-1){} virtual ~Subject(); void Notify(); // 通知對象改變狀態(tài) void Attach(Observer *pObserver); // 新增對象 void Detach(Observer *pObserver); // 刪除對象 // 虛函數(shù),提供默認(rèn)的實(shí)現(xiàn),派生類可以自己實(shí)現(xiàn)來覆 基類的實(shí)現(xiàn) virtual void SetState(STATE nState); // 設(shè)置狀態(tài) virtual STATE GetState(); // 得到狀態(tài) protected: STATE m_nSubjectState; // 模擬保存Subject 狀態(tài)的變量 std::list<Observer*> m_ListObserver; // 保存Observer 指針的鏈表
}; // ConcreateSubject 類,派生在Subject 類
class ConcreateSubject : public Subject
{
public: ConcreateSubject() : Subject(){} virtual ~ConcreateSubject(){} // 派生類自己實(shí)現(xiàn)來覆 基類的實(shí)現(xiàn) virtual void SetState(STATE nState); // 設(shè)置狀態(tài) virtual STATE GetState(); // 得到狀態(tài)
}; //訂閱者
// Observer 抽象基類
class Observer
{
public: Observer() : m_nObserverState(-1){} virtual ~Observer(){} // 純虛函數(shù),各個派生類可能有不同的實(shí)現(xiàn) // 通知Observer 狀態(tài)發(fā)生了變化 virtual void Update(Subject* pSubject) = 0; protected: STATE m_nObserverState; // 模擬保存Observer 狀態(tài)的變量
};
// ConcreateObserver 類派生自O(shè)bserver
class ConcreateObserver : public Observer
{
public: ConcreateObserver() : Observer(){} virtual ~ConcreateObserver(){} // 虛函數(shù),實(shí)現(xiàn)基類提供的接口 virtual void Update(Subject* pSubject);
}; #endif
#include "StdAfx.h" #include "observer_impl.h"#include <iostream> #include <algorithm> /* ---------------------- | Subject 類成員函數(shù)的實(shí)現(xiàn) | -*/ void Subject::Attach(Observer *pObserver) { std::cout << "Attach an Observer:"<<pObserver<<std::endl; m_ListObserver.push_back(pObserver); }void Subject::Detach(Observer *pObserver) { std::list<Observer*>::iterator iter; iter = std::find(m_ListObserver.begin(), m_ListObserver.end(), pObserver); if (m_ListObserver.end() != iter) { std::cout << "Detach an Observer:"<<*iter<<std::endl; m_ListObserver.erase(iter); } } void Subject::Notify() { std::cout <<this<<" Notify Observers's State"<<std::endl; std::list<Observer*>::iterator iter1, iter2; for (iter1 = m_ListObserver.begin(), iter2 = m_ListObserver.end(); iter1 != iter2; ++iter1) { (*iter1)->Update(this); } } void Subject::SetState(STATE nState) { m_nSubjectState = nState; } STATE Subject::GetState() { return m_nSubjectState; } Subject::~Subject() { std::list<Observer*>::iterator iter1, iter2, temp; for (iter1 = m_ListObserver.begin(), iter2 = m_ListObserver.end(); iter1 != iter2;) { temp = iter1; ++iter1; delete (*temp); } m_ListObserver.clear(); } /* ---------------------- | ConcreateSubject 類成員函數(shù)的實(shí)現(xiàn) | -*/ void ConcreateSubject::SetState(STATE nState) { m_nSubjectState = nState; } STATE ConcreateSubject::GetState() { return m_nSubjectState; } /* ---------------------- | ConcreateObserver 類成員函數(shù)的實(shí)現(xiàn) | -*/ void ConcreateObserver::Update(Subject* pSubject) {if (NULL == pSubject) return; m_nObserverState = pSubject->GetState(); std::cout << "Observer:"<<this<<" GetState:" <<m_nObserverState << std::endl; }
// Observer.cpp : 定義控制臺應(yīng)用程序的入口點(diǎn)。 //#include "stdafx.h"#include "observer_impl.h"int _tmain(int argc, _TCHAR* argv[]) {Observer *p1 = new ConcreateObserver; //訂閱者1Observer *p2 = new ConcreateObserver; //訂閱者2Subject* p = new ConcreateSubject; //發(fā)布者p->Attach(p1); //添加訂閱p->Attach(p2); p->SetState(4); //狀態(tài)改變p->Notify(); //發(fā)布通知p->Detach(p1); //刪除訂閱p->SetState(10); //狀態(tài)改變p->Notify(); //發(fā)布通知delete p; system("pause"); return 0; }
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀
#include "StdAfx.h" #include "observer_impl.h"#include <iostream> #include <algorithm> /* ---------------------- | Subject 類成員函數(shù)的實(shí)現(xiàn) | -*/ void Subject::Attach(Observer *pObserver) { std::cout << "Attach an Observer:"<<pObserver<<std::endl; m_ListObserver.push_back(pObserver); }void Subject::Detach(Observer *pObserver) { std::list<Observer*>::iterator iter; iter = std::find(m_ListObserver.begin(), m_ListObserver.end(), pObserver); if (m_ListObserver.end() != iter) { std::cout << "Detach an Observer:"<<*iter<<std::endl; m_ListObserver.erase(iter); } } void Subject::Notify() { std::cout <<this<<" Notify Observers's State"<<std::endl; std::list<Observer*>::iterator iter1, iter2; for (iter1 = m_ListObserver.begin(), iter2 = m_ListObserver.end(); iter1 != iter2; ++iter1) { (*iter1)->Update(this); } } void Subject::SetState(STATE nState) { m_nSubjectState = nState; } STATE Subject::GetState() { return m_nSubjectState; } Subject::~Subject() { std::list<Observer*>::iterator iter1, iter2, temp; for (iter1 = m_ListObserver.begin(), iter2 = m_ListObserver.end(); iter1 != iter2;) { temp = iter1; ++iter1; delete (*temp); } m_ListObserver.clear(); } /* ---------------------- | ConcreateSubject 類成員函數(shù)的實(shí)現(xiàn) | -*/ void ConcreateSubject::SetState(STATE nState) { m_nSubjectState = nState; } STATE ConcreateSubject::GetState() { return m_nSubjectState; } /* ---------------------- | ConcreateObserver 類成員函數(shù)的實(shí)現(xiàn) | -*/ void ConcreateObserver::Update(Subject* pSubject) {if (NULL == pSubject) return; m_nObserverState = pSubject->GetState(); std::cout << "Observer:"<<this<<" GetState:" <<m_nObserverState << std::endl; }
// Observer.cpp : 定義控制臺應(yīng)用程序的入口點(diǎn)。 //#include "stdafx.h"#include "observer_impl.h"int _tmain(int argc, _TCHAR* argv[]) {Observer *p1 = new ConcreateObserver; //訂閱者1Observer *p2 = new ConcreateObserver; //訂閱者2Subject* p = new ConcreateSubject; //發(fā)布者p->Attach(p1); //添加訂閱p->Attach(p2); p->SetState(4); //狀態(tài)改變p->Notify(); //發(fā)布通知p->Detach(p1); //刪除訂閱p->SetState(10); //狀態(tài)改變p->Notify(); //發(fā)布通知delete p; system("pause"); return 0; }
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀
總結(jié)
以上是生活随笔為你收集整理的设计模式-行为-观察者的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式-行为-迭代器
- 下一篇: 设计模式-行为-模板方法