Observer模式

  观察者模式(有时又被称为发布/订阅模式)是软件设计模式的一种。在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实作事件处理系统。

抽象目标类别

  此抽象类别提供一个接口让观察者进行添附与解附作业。此类别内有个不公开的观察者串炼,并透过下列函数(方法)进行作业:

  添附(Attach):新增观察者到链表中,以追踪目标对象的变化。

  解附(Detach):将已经存在的观察者从串炼中移除。

  通知(Notify):利用观察者所提供的更新函式来通知此目标已经产生变化。

  添附函数包涵了一个观察者对象参数。也许是观察者类别的虚函,或是在非面向对象的设定中所使用的函数。

目标类别

  此类别提供了观察者欲追踪的状态。也利用其源类别(例如前述的抽象目标类别)所提供的方法,来通知所有的观察者其状态已经更新。此类别拥有以下函数:

  取得状态(GetState):回传该目标对象的状态。

抽象观察者接口

  抽象观察者类别是一个必须被实做的抽象类别。这个类别定义了所有观察者都拥有的更新用接口,此接口是用来接收目标类别所发出的更新通知。此类别含有以下函数:

  更新(Update):会被实做的一个抽象函数。

观察者类别

  这个类别含有指向目标类别的参考(reference),以接收来自目标类别的更新状态。此类别含有以下函数:

  更新(Update):是前述抽象函式的实做。当这个函数被目标对象调用时,观察者对象将会调用目标对象的取得状态函数,获取所拥有的更新目标对象信息。

  每个观察者类别都要实做它自己的更新函数,以应对状态更新的情形。

  当目标对象改变时,会通过调用它自己的通知函数来将通知送给每一个观察者对象,这个通知函数则会去调用已经添附在链表内的观察者更新函数。通知与更新函数可能会有一些参数,好指明是目前目标对象内的何种改变。这样做将可增进观察者的效率(只更新那些改变部份的状态)。

/* Observer.h */

#ifndef OBSERVER_H

#define OBSERVER_H

#include <list>

typedef int STATE ;

class Observer ;

// Subject抽象基类,只需要知道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; // 模拟保存Subject状态的变量

std:: list< Observer*> m_ListObserver; // 保存Observer指针的链表

};

// Observer抽象基类

class Observer

{

public:

Observer() : m_nObserverState(-1){}

virtual ~Observer(){}

// 纯虚函数,各个派生类可能有不同的实现

// 通知Observer状态发生了变化

virtual void Update( Subject* pSubject) = 0;

protected:

STATE m_nObserverState; // 模拟保存Observer状态的变量

};

// ConcreateSubject类,派生在Subject类

class ConcreateSubject : public Subject

{

public:

ConcreateSubject() : Subject(){}

virtual ~ConcreateSubject(){}

// 派生类自己实现来覆盖基类的实现

virtual void SetState( STATE nState); // 设置状态

virtual STATE GetState(); // 得到状态

};

// ConcreateObserver类派生自Observer

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 << "Attach an Observern";

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)

{

m_ListObserver.erase(iter);

}

std::cout << "Detach an Observern";

}

void Subject ::Notify()

{

std::cout << "Notify Observers‘s Staten";

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)

{

std::cout << "SetState By Subjectn";

m_nSubjectState = nState;

}

STATE Subject ::GetState()

{

std::cout << "GetState By Subjectn";

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类成员函数的实现

|

----------------------------------------------------------------------*/

void ConcreateSubject ::SetState(STATE nState)

{

std::cout << "SetState By ConcreateSubjectn" ;

m_nSubjectState = nState;

}

STATE ConcreateSubject ::GetState()

{

std::cout << "GetState By ConcreateSubjectn" ;

return m_nSubjectState;

}

/**//* --------------------------------------------------------------------

|    ConcreateObserver类成员函数的实现

|

----------------------------------------------------------------------*/

void ConcreateObserver ::Update(Subject * pSubject )

{

if ( NULL == pSubject)

return;

m_nObserverState = pSubject->GetState();

std::cout << "The ObeserverState is " << m_nObserverState << std::endl;

}

/* Main.cpp */

#include "Observer.h"

#include <iostream>

int main()

{

Observer *p1 = new ConcreateObserver;

Observer *p2 = new ConcreateObserver;

Subject* p = new ConcreateSubject;

p->Attach(p1);

p->Attach(p2);

p->SetState(4);

p->Notify();

p->Detach(p1);

p->SetState(10);

p->Notify();

delete p;

system( "pause");

return 0;

}

Observer模式,布布扣,bubuko.com

时间: 2024-10-05 04:02:33

Observer模式的相关文章

Observer模式实践

Observer 模式在实践中的应用场景: 为 Point 类设计一个数据绑定机制,当其坐标 x 或 y 被更改时,可以通知外界其更改的过程.将更改过程打印在控制台上.考虑使用松耦合设计. 代码: #include <list> #include <iostream> using namespace std; struct Observer; struct Subject { virtual void attach(Observer*) = 0; virtual void deta

【行为型】Observer模式

观察者模式意图解决一对多的依赖关系情形中,当被依赖对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新的问题.举个很简单的例子说,假如一个游戏中的角色的某个属性状态发生了变化,此处不妨假设为角色的等级升级了,则相应的在游戏场景中的模型展现([依赖点1])需要跟着调整,并且在UI界面上的角色属性([依赖点2])描述细节中还需要及时更新成新等级值展现给玩家.这边的[依赖点1]与[依赖点2]就依赖于角色的属性,并且对于这两个依赖点来说,属性对它们都是很敏感的,它们需要能够及时感知到这些属性的

用java.util.Observable实现Observer模式

本文转载自:dada360778512的博客 原文链接:http://blog.csdn.net/dada360778512/article/details/6977758 Observer模式  主要是观察者与被观察者之间的关系 观察者为羊,被观察者为狼  模仿的场景为狼叫羊跑 代码如下: 1.被观察者类 [java] view plaincopy package test.pattern.observer; import java.util.Observable; public class 

Observer 模式

Observer模式要解决的问题为:建立一个一(Subject)对多(Observer)的依赖关系,并且做到当"一"变化的时候,依赖这个"一"的多也能够同步改变.最常见的一个例子就是:对同一组数据进行统计分析时候,我们希望 能够提供多种形式的表示 (例如以表格进行统计显示. 柱状图统计显示. 百分比统计显示等) .这些表示都依赖于同一组数据,我们当然需要当数据改变的时候,所有的统计的显示都能够同时改变.Observer模式就是解决了这一个问题. 1 ////////

Android 适配器(Adapter)、观察者(Observer) 模式

适配器(Adapter)详述:http://blog.csdn.net/jjwwmlp456/article/details/39893723 观察者(Observer)详述:http://blog.csdn.net/jjwwmlp456/article/details/39967021 AdapterView 体系 AdapterView中会使用Adapter Adapter 体系 BaseAdapter 实现了 SpinnerAdapter.ListAdapter 这样的形式,就是 适配器模

Observer模式详解--设计模式(15)

Observer模式来源: Observer模式应该可以说是应用最多.影响最广的模式之一. 因为Observer的一个实例Model/View/Control(MVC)结构在系统开发架构设计中有着很重要的地位和意义,MVC实现了业务逻辑和表示层的解耦.在MFC中,Doc/View(文档视图结构)提供了实现MVC的框架结构(有一个从设计模式(Observer模式)的角度分析分析Doc/View的文章正在进一步的撰写当中,遗憾的是时间:)).在Java阵容中,Struts则提供和MFC中Doc/Vi

C++实现Behavioral - Observer模式 (转)

转http://patmusing.blog.163.com/blog/static/13583496020101501923571/ 也称为Dependents或Publish-Subscribe模式. 定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新. “Define a one-to-many dependency between objects so that when one object changes state, all i

Java 实现观察者(Observer)模式

1. Java自带的实现 类图 /** * 观察目标 继承自 java.util.Observable * @author stone * */ public class UpdateObservable extends Observable { private int data; public UpdateObservable(Observer observer) { addObserver(observer); /* * add other observer */ } public int

重温Observer模式--热水器·改

在 C#中的委托和事件 一文的后半部分,我向大家讲述了Observer(观察者)模式,并使用委托和事件实现了这个模式.实际上,不使用委托和事件,一样可以实现Observer模式.在本文中,我将使用GOF的经典方式,再次实现一遍Observer模式,同时将讲述在 C#中的委托和事件 一文中没有提及的推模式(Push)和拉模式(Pull). 设计思想概述 在 C#中的委托和事件 一文后半部分中我已经较详细的讲述了Observer设计模式的思想,所以这里仅简单的提及一下.Observer设计模式中实际