Observer模式要解决的问题为:建立一个一(Subject)对多(Observer)的依赖关系,并且做到当“一”变化的时候,依赖这个“一”的多也能够同步改变。最常见的一个例子就是:对同一组数据进行统计分析时候,我们希望

能够提供多种形式的表示 (例如以表格进行统计显示、 柱状图统计显示、 百分比统计显示等) 。这些表示都依赖于同一组数据,我们当然需要当数据改变的时候,所有的统计的显示都能够同时改变。Observer模式就是解决了这一个问题。

 /////////////Subject.h/////////////////////////////////////////////////////////////
#pragma once
#include <string>
#include <list>
using namespace std;
class Observer ; typedef string State ;
class Subject
{
public:
virtual ~Subject();
virtual void Attach(Observer* obv);
virtual void Detach(Observer* obv);
virtual void Notify();
virtual void SetState(const State& st) = ;
virtual State GetState() = ;
protected:
Subject(); private:
list<Observer*>* _Obvs ;
}; class ConcreteSubject : public Subject
{
public:
~ConcreteSubject();
ConcreteSubject();
State GetState();
void SetState(const State& st) ;
protected:
private:
State _st ;
};
 //////////////////Observer.h////////////////////////////////////////////////////////
#pragma once
#include <string>
using namespace std;
typedef string State ;
class Subject ; class Observer
{
public:
virtual ~Observer();
virtual void Update(Subject* sub) = ;
virtual void PrintInfo() = ;
State _st ;
protected:
Observer(); private:
}; class ConcreteObserverA : public Observer
{
public:
~ConcreteObserverA();
ConcreteObserverA(Subject* sub);
virtual Subject* GetSubject();
void Update(Subject* sub);
void PrintInfo();
protected:
private:
Subject* _sub ;
}; class ConcreteObserverB : public Observer
{
public:
~ConcreteObserverB();
ConcreteObserverB(Subject* sub);
virtual Subject* GetSubject();
void Update(Subject* sub);
void PrintInfo();
protected:
private:
Subject* _sub ;
};
 ////////////Subject.cpp//////////////////////////////////////////////////////////////
#include "Subject.h"
#include "Observer.h"
#include <list>
typedef string State ; Subject::Subject()
{
_Obvs = new list<Observer*>();//在模板的使用之前一定要new
}
Subject::~Subject()
{ } void Subject::Attach(Observer* obv)
{
_Obvs->push_front(obv);
}
void Subject::Detach(Observer* obv)
{
if (obv != NULL)
{
_Obvs->remove(obv);
}
}
void Subject::Notify()
{
list<Observer*>::iterator it = _Obvs->begin();
for (;it != _Obvs->end(); it++)
{
(*it)->Update(this);
}
} ConcreteSubject::~ConcreteSubject()
{ }
ConcreteSubject::ConcreteSubject()
{
_st = '\0';
}
State ConcreteSubject::GetState()
{
return _st ;
}
void ConcreteSubject::SetState(const State& st)
{
_st = st ;
}
 ////////////Observer.cpp//////////////////////////////////////////////////////////////
#include "Observer.h"
#include "Subject.h"
#include <iostream>
using namespace std ;
Observer::Observer()
{
_st = '\0';
}
Observer::~Observer()
{ } ConcreteObserverA::ConcreteObserverA(Subject* sub)
{
_sub = sub ;
_sub->Attach(this);
}
ConcreteObserverA::~ConcreteObserverA()
{
_sub->Detach(this);
if (_sub != NULL)
{
delete _sub ;
}
} Subject* ConcreteObserverA::GetSubject()
{
return _sub ;
}
void ConcreteObserverA::PrintInfo()
{
cout<<"观察者A的到的通知:"<<_sub->GetState()<<endl;
} void ConcreteObserverA::Update(Subject* sub)
{
_st = sub->GetState();
PrintInfo();
} ConcreteObserverB::ConcreteObserverB(Subject* sub)
{
_sub = sub ;
_sub->Attach(this);
}
ConcreteObserverB::~ConcreteObserverB()
{
_sub->Detach(this);
if (_sub != NULL)
{
delete _sub;
}
}
Subject* ConcreteObserverB::GetSubject()
{
return _sub ;
} void ConcreteObserverB::PrintInfo()
{
cout<<"观察者B的到的通知:"<<_sub->GetState()<<endl;
}
void ConcreteObserverB::Update(Subject* sub)
{
_st = sub->GetState();
PrintInfo();
}
 /////////////main.cpp/////////////////////////////////////////////////////////////
#include "Subject.h"
#include "Observer.h"
#include <iostream>
using namespace std; int main()
{
Subject* sub = new ConcreteSubject();
Observer* o1 = new ConcreteObserverA(sub);
Observer* o2 = new ConcreteObserverB(sub); sub->SetState("你获得一封邮件!");
sub->Notify();
sub->SetState("你的评论有新的回复!");
sub->Notify(); getchar();
return ;
}

Observer 模式的更多相关文章

  1. C# 关于委托和事件的妙文:通过一个例子详细介绍委托和事件的作用;Observer模式简介

    委托和事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见 ...

  2. 【行为型】Observer模式

    观察者模式意图解决一对多的依赖关系情形中,当被依赖对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新的问题.举个很简单的例子说,假如一个游戏中的角色的某个属性状态发生了变化,此处不妨假设为 ...

  3. Java 实现观察者(Observer)模式

    1. Java自带的实现 类图 /** * 观察目标 继承自 java.util.Observable * @author stone * */ public class UpdateObservab ...

  4. Behavioral模式之Observer模式

    1.意图 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,全部依赖于它的对象都得到通知并被自己主动更新. 2.别名 依赖(dependents).公布-订阅(Publish-Subscr ...

  5. 3)Javascript设计模式:Observer模式

    Observer模式 var Observer = (function() { var instance = null; function Observe() { this.events = {} } ...

  6. Java设计模式(20)观察者模式(Observer模式)

    Java深入到一定程度,就不可避免的碰到设计模式(design pattern)这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循 ...

  7. Observer模式实践

    Observer 模式在实践中的应用场景: 为 Point 类设计一个数据绑定机制,当其坐标 x 或 y 被更改时,可以通知外界其更改的过程.将更改过程打印在控制台上.考虑使用松耦合设计. 代码: # ...

  8. 设计模式之——Observer模式

    Observer模式又叫做观察者模式,当观察对象状态发生变化的时候,就会通知给观察者.这种模式适用于根据对象状态进行响应的场景! 实例程序是一个输出数字的程序. 观察者Observer类用于每500m ...

  9. Observer模式(观察者设计模式)

    Observer 设计模式? 在Observer模式中,当观察对象的状态发生变化时,会通知给观察者.Observer模式适用于根据对象状态进行相应处理的场景. Observer 并非主动观察,而是被动 ...

随机推荐

  1. 执行一条cmd命令的window.bat 批处理代码:

    . .执行一条cmd命令的window.bat 批处理代码: @echo off echo NodeJS SUPERVISOR...Server.js ::下面是批处理代码 supervisor d: ...

  2. time.h

    目录 1简介 2代码示例 3从系统时钟获取时间方式 4time函数介绍 函数名称: localtime 函数名称: asctime 函数名称: ctime 函数名称: difftime 函数名称: g ...

  3. Java中static和final的区别

    static是静态修饰关键字,可以修饰变量和程序块以及类方法: 当定义一个static的变量的时候jvm会将将其分配在内存堆上,所有程序对它的引用都会指向这一个地址而不会重新分配内存: 当修饰一个程序 ...

  4. 在Jersey中如何处理泛型集合

    Jersey是一个标准的Restful Web service框架,可以方便的实现Restful的Server端和客户端. 本文主要介绍使用Jersey客户端时如何将Json格式的数组转换成java的 ...

  5. Mysql查找如何判断字段是否包含某个字符串

    Mysql查找如何判断字段是否包含某个字符串   有这样一个需求,在Mysql数据库字符串字段(权限)中,用户有多个不同的邮箱,分别被‘,’分开,现在要取出某个邮箱的所有成员列表.   假设有个表: ...

  6. ACMDP之最长公共子序列长度—HDU1159

    Common Subsequence Problem Description A subsequence of a given sequence is the given sequence with ...

  7. 20169210《Linux内核原理与分析》第七周作业

    第一部分:实验 首先还是网易云课堂的实验内容,扒开系统调用的三层皮(下),分为两部分: 1.给MenuOS增加time和time-asm命令 2.系统调用在内核代码中的处理过程 给MenuOS增加ti ...

  8. 介绍几种大型的Oracle/SQL Server数据库免费版

    我们知道,Oracle和SQL Server等大型数据库也都存在一些免费的版本,这些免费的版本已经能够满足许多中小项目的需求.对于在校大学生来说,从学习的目标上来讲,安装免费版的大型数据库也就足够用了 ...

  9. DateTime.TryParseExact 万能时间格式转化

    本文转载:http://blog.csdn.net/gaofang2009/article/details/6073231 前天同事问C#有没有相关的方法能把"年月日时分秒"这样的 ...

  10. LINQ如何递归子控件

    private void SetTextReadOnly(Control ctr, bool blReadOnly) { ctr.Controls.Cast<Control>().Sele ...