Observer设计模式(C++)

个人对设计模式理解不够深刻,无法全面概括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>

程序的运行结果如下所示:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值