个人对设计模式理解不够深刻,无法全面概括Observer设计模式全部精髓,认识初步停留在:
1. 观察者模式可以实现一对多功能。
2. 观察者模式可以实现Model/View/Control(MVC)结构;
摘录《设计模式精解-GoF 23 种设计模式解析》的讲解:
Observer模式应该可以说是应用最多、影响最广的模式之一,因为Observer的一个实例Model/View/Control(MVC)结构在系统开发架构设计中有着很重要的地位和意义,MVC实现了业务逻辑和表示层的解耦。个人也认为Observer模式是软件开发过程中必须要掌握和使用的模式之一。在MFC中,Doc/View(文档视图结构)提供了实现MVC的框架结构(有一个从设计模式(Observer模式)的角度分析分析Doc/View的文章正在进一步的撰写当中,遗憾的是时间:))。在Java阵容中,Struts则提供和MFC中Doc/View结构类似的实现MVC的框架。另外Java语言本身就提供了Observer模式的实现接口,这将在讨论中给出。
当然,MVC只是Observer模式的一个实例。Observer模式要解决的问题为:建立一个一(Subject)对多(Observer)的依赖关系,并且做到当“一”变化的时候,依赖这个“一”的多也能够同步改变。最常见的一个例子就是:对同一组数据进行统计分析时候,我们希望能够提供多种形式的表示(例如以表格进行统计显示、柱状图统计显示、百分比统计显示等)。这些表示都依赖于同一组数据,我们当然需要当数据改变的时候,所有的统计的显示都能够同时改变。Observer模式就是解决了这一个问题。
Observer模式典型的结构图为:
这里的目标Subject提供依赖于它的观察者Observer的注册(Attach)和注销(Detach)操作,并且提供了使得依赖于它的所有观察者同步的操作(Notify)。观察者Observer则提供一个Update操作,注意这里的Observer的Update操作并不在Observer改变了Subject目标状态的时候就对自己进行更新,这个更新操作要延迟到Subject对象发出Notify通知所有Observer进行修改(调用Update)。
我试验的代码如下:
<span style="font-size:12px;">//observer.h
#pragma once
class Subject;
class Observer
{
public:
Observer(){}
virtual ~Observer(){}
virtual void Update(Subject &subject) {}
};
</span>
<span style="font-size:12px;">//subject.h
#pragma once
#include <list>
#include "observer.h"
class Subject
{
public:
Subject(){}
virtual ~Subject(){}
void RegisterObserver(Observer *observer){ m_observers.push_back(observer);} //添加观察者
void RemoveObserver(Observer *observer) { m_observers.remove(observer); } //移除观察者
void Notify() //通知观察者
{
std::list<Observer*>::iterator iter = m_observers.begin();
for(; iter != m_observers.end(); iter++)
(*iter)->Update(*this);
}
protected:
private:
std::list<Observer* > m_observers; //观察者链表
};</span>
<span style="font-size:12px;">// Main.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include "observer.h"
#include "subject.h"
class MM:public Subject
{
public:
MM(){};
~MM(){};
void SetStatus(int i){state=i;}
int GetStatus(){return state;}
private:
int state;
};
class Child1:public Observer
{
public:
Child1(MM *mm):member_mm(mm){};
~Child1(){};
MM *member_mm;
void Update(Subject &subject)
{
if (member_mm->GetStatus()==1)
{
std::cout<<"妈妈喊大儿子回家吃饭啦!"<<std::endl;
}
if (member_mm->GetStatus()==2)
{
std::cout<<"妈妈喊大儿子回家干活啦!"<<std::endl;
}
}
};
class Child2:public Observer
{
public:
Child2(MM *mm):member_mm(mm){};
~Child2(){};
MM *member_mm;
void Update(Subject &subject)
{
if (member_mm->GetStatus()==1)
{
std::cout<<"妈妈喊二儿子回家吃饭啦!"<<std::endl;
}
if (member_mm->GetStatus()==2)
{
std::cout<<"妈妈喊二儿子回家干活啦!"<<std::endl;
}
}
};
int _tmain(int argc, _TCHAR* argv[])
{
MM *mm=new MM();
Child1 *chd1=new Child1(mm);
Child2 *chd2=new Child2(mm);
mm->RegisterObserver(chd1);
mm->RegisterObserver(chd2);
mm->SetStatus(1);
mm->Notify();
mm->SetStatus(2);
mm->Notify();
delete mm; delete chd1;delete chd2;
return 0;
}
</span>
程序的运行结果如下所示: