关闭

设计模式之观察者模式,C++实现(上部分)

2005人阅读 评论(2) 收藏 举报

原文地址: http://blog.csdn.net/iuhsihsow


说起观察者模式犹如黄河之水,滔滔不绝,一发而不可收拾啊。

今天先写上半部分,明天写事件委托。




直接上代码,感谢scl的分享


// 观察者模式定义了一种一对多的依赖,让多个观察者对象同时监听某一个
 // 主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使
 // 他们能够自动更新自己。
 
 
 
 // 观察者模式是一个很重要的模式,使用频率是非常高啊
 
 // 当一个对象改变需要同时改变其他对象的时候
 // 当具体不知道有多少个对象有待改变的时候。
 
 
 // 适用的范围
 // 在《大话模式》中,众多的观察者对象是上班开小差,看NBA,炒股票的同事
 // 主题对象是坐在门口的前台。当老板回到公司的时候,前台会通知所有的“注册”
 // 后的同事赶紧干正经事。
 
 
 // 其实三维浏览中也可以用到
 // 将各种行为作为观察者对象,摄像机为主题对象,主题对象通过给观察对象当前的
 // 时间来更新各种浏览控制器,浏览控制器再调整摄像机各个参数。
 
 
 
 // 情景假设
 // 对一飞机飞行进行控制,
 // 先飞行小于10秒
 // 在旋转小于20秒
 
 
 
 #include "stdafx.h"
 #include <Windows.h>
 #include <iostream>
 #include <vector>
 
 // 毕竟作为示例,还是开发效率重要,
 // 所以就用using namespace吧
 using namespace std;
 
 //浏览控制器基类
 class IControl
 {
 public:
 virtual bool Update(double dtime) = 0;
 virtual bool Begin(double dtime ) = 0;
 virtual bool IsFinish() = 0;
 
 protected:
 	double	m_dLastTime;
 	bool	m_bFinish;
 private:
 };
 
 //飞行浏览控制器
 class FlyControl : public IControl
 {
 public:
 	bool Begin(double dtime)
 	{
 		m_bFinish = false;
 		m_dLastTime = dtime;
 		return true;
 	}
 	bool Update(double dtime)
 	{
 		double dDetal = dtime - m_dLastTime;
 		if (dDetal > 10)
 		{
 			cout<<"Complete fly!"<<endl;
 			m_bFinish = true;
 			return true;
 		}
 		cout<<"We have fly  "<<dDetal<<"  meters!"<<endl;
 	}
 	bool IsFinish()
 	{
 		return m_bFinish;
 	}
 protected:
 private:
 };
 
 //转向浏览控制器
 class RotateControl : public IControl
 {
 public:
 	bool Begin(double dtime)
 	{
 		m_bFinish = false;
 		m_dLastTime = dtime;
 		return true;
 	}
 	bool Update(double dtime)
 	{
 		double dDetal = dtime - m_dLastTime;
 		if (dDetal > 20)
 		{
 			cout<<"Complete Rotate!"<<endl;
 			m_bFinish = true;
 			return true;
 		}
 		cout<<"We have Rotate  "<<dDetal<<"  degress"<<endl;
 	}
 	bool IsFinish()
 	{
 		return m_bFinish;
 	}
 protected:
 private:
 };
 
 
 // 控制器集合
 class ControlList
 {
 public:
 	int GetCount()
 	{
 		return m_CtrlVec.size();
 	}
 	void SetTime(double dTime)
 	{
 		m_dLastTime = dTime;
 	}
 	void Attach(IControl *pCtrl)
 	{
 		for (int i = 0; i < m_CtrlVec.size(); i++)
 		{
 			if (pCtrl == m_CtrlVec[i])
 			{
 				return;
 			}
 		}
 		m_CtrlVec.push_back(pCtrl);
 	}
 	void Detach(IControl *pCtrl)
 	{
 		for (int i = 0; i < m_CtrlVec.size(); i ++)
 		{
 			if (pCtrl == m_CtrlVec[i])
 			{
 				m_CtrlVec.erase(m_CtrlVec.begin() + i);
 			}
 			return;
 		}
 	}
 
 	bool UpdateAllCtrls(double dtime)
 	{
 		double dT = dtime - m_dLastTime;
 		if (dT == 0.0)
 		{
 			return false;
 		}
 
 		int nSize = m_CtrlVec.size();
 		if ( m_CtrlVec.size() != 0 ) 
 		{	
 			IControl* pCtrl = m_CtrlVec.front();
 			if ( NULL != pCtrl ) 
 			{
 				pCtrl->Update( dtime );
 
 				if ( pCtrl->IsFinish() ) 
 				{
 					delete pCtrl;
 					pCtrl = NULL;
 					m_CtrlVec.erase(m_CtrlVec.begin());
 
 					if ( m_CtrlVec.size() != 0 ) 
 					{
 						pCtrl = m_CtrlVec.front();
 						if ( NULL != pCtrl ) 
 						{
 							pCtrl->Begin( dtime );
 						}								
 					} 
 				} 
 			} 
 		} 
 
 		m_dLastTime = dtime;
 
 		return true;
 	}
 
 protected:
 private:
 	std::vector<IControl*>	m_CtrlVec;
 	double					m_dLastTime;
 
 };
 
 
 // 
 // Plain
 // 飞机类
 class Plain : public ControlList
 {
 public:
 protected:
 private:
 };
 
 
 int _tmain(int argc, _TCHAR* argv[])
 {
 	//演示程序,就不用多线程了
 
 	Plain plain;
 	
 	//恩,现在时刻是0.0
 	double curTime = 0.0;
 	plain.SetTime(curTime);
 	FlyControl *pFlyCtrl = new FlyControl;
 	pFlyCtrl->Begin(curTime);
 	plain.Attach(pFlyCtrl);
 	//恩,现在时刻是0.1
 	curTime = 0.1; 
 	RotateControl *pRoCtrl = new RotateControl;
 	pRoCtrl->Begin(curTime);
 	plain.Attach(pRoCtrl);
 
 	while(plain.GetCount())
 	{
 		Sleep(200);
 		// 模拟时间的流逝
 		// 7.5倍的速度
 		curTime += 1.5;
 		plain.UpdateAllCtrls(curTime);
 	}
 
 	return 0;
 }
 
 // 输出结果
 //We have fly  1.6  meters!
 //We have fly  3.1  meters!
 //We have fly  4.6  meters!
 //We have fly  6.1  meters!
 //We have fly  7.6  meters!
 //We have fly  9.1  meters!
 //Complete fly!
 //We have Rotate  1.5  degress
 //We have Rotate  3  degress
 //We have Rotate  4.5  degress
 //We have Rotate  6  degress
 //We have Rotate  7.5  degress
 //We have Rotate  9  degress
 //We have Rotate  10.5  degress
 //We have Rotate  12  degress
 //We have Rotate  13.5  degress
 //We have Rotate  15  degress
 //We have Rotate  16.5  degress
 //We have Rotate  18  degress
 //We have Rotate  19.5  degress
 //Complete Rotate!
 //请按任意键继续. . .


2
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

c++利用链表写一个简单的栈

c++中其实有stack的模板类。功能更为强大。 自己写一个栈能让我们对栈这种数据结构更加熟悉。这个栈有一个不足之处就是里面存放的元素类型只能为int。#include <iostream> using namespace std; class Stack { private: ...
  • huplion
  • huplion
  • 2015-11-16 19:47
  • 1331

基于RSA的盲签名算法Java实现

目录目录 盲签名概念 基于RSA的盲签名原理 Java实现 参考书目盲签名概念盲签名(Blind Signature): Alice有个数据想让Bob签名,但是不想让Bob知道真实的数据,于是有了盲签名的概念。盲签名在很多地方都有许多应用,如电子投票等。一个通俗的解释是:Alice想让Bob在一张信...
  • forest_open
  • forest_open
  • 2017-05-23 16:35
  • 609

Bridge 桥接模式

将抽象部分与实现部分分离,使得都可以独立地变化。 使用原因:一个抽象可能会有多个实现,往往通过继承来协调。但是抽象部分(对现实事物的抽象)和实现部分(具体实现)会在继承时绑定,不够灵活。 举例(这里使用设计模式一书中的例子):我们需要一个window类,并且需要window类在x...
  • raindaywhu
  • raindaywhu
  • 2015-03-12 01:16
  • 195

C语言 - 自定义实现字符串部分复制函数

自定义实现字符串部分复制函数
  • sinat_34104446
  • sinat_34104446
  • 2016-12-20 13:04
  • 2375

如何实现 java 接口中的部分方法

接口和抽象类的区别?为什么需要接口? 1、不同点:接口就是比“抽象类”还“抽象”的“抽象类”,可以更加宽泛的对子类进行约束。全面的实现了:规范和具体实现的分离 在抽象类内可以有具体的方法实现,可以定义变量,但是接口里面只能定义常量和空方法。 相同点:接口和抽象类都不能实例化一个对象,如果一个类...
  • Maxiao1204
  • Maxiao1204
  • 2016-07-29 14:09
  • 1341

快排的c++实现(两种实现方式)

快速排序算法是现在用的最广的排序算法,也是效率最高的。它有两种实现方式,一种是定轴法,另外一种是挖坑法。这里简单介绍一下两种实现方法的思想,并附上C++实现代码。 (一)定轴法: 1.备份对轴(首记录) 2.取两个指针left和right,初始值分别是序列的第二个元素和最后一个元素,并且l...
  • jeryjeryjery
  • jeryjeryjery
  • 2016-10-22 20:51
  • 3996

C++实现屏幕截图的方法

第一步:建立Windows 32控制台控制程序 第二部:设置工程的属性如下:MFC的使用 --> 在共享 DLL 中使用 MFC stdafx.h #pragma once #define WIN32_LEAN_AND_MEAN // 从 Win...
  • u011762549
  • u011762549
  • 2013-11-21 08:51
  • 2540

C++实现鼠标选中框功能代码

C++实现鼠标选中框功能代码: bool m_IsMouseScelect; CSprite m_RectImage; RECT m_MouseRect;
  • OnInit
  • OnInit
  • 2013-12-15 15:15
  • 1325

c++ 数据结构 *** 树的部分实现

代码如下: #pragma once #ifndef HEAD_H #define HEAD_H #include #include #include using namespace std; template class tree; template class treeNode { f...
  • treeshy
  • treeshy
  • 2015-12-20 19:36
  • 154

什么是正则表达式?浅谈 c++中的正则表达式

截取作者c++部分 原文地址 什么是正则表达式? 正则表达式(Regular Expression)就是用某种模式去匹配一类字符串的公式。如你要在一篇文章中查找第一个字是“李”最后一个字是“明”的三个字的姓名,即“李*明”;那么“李*明”就是公式,也称作模式(Patt...
  • jiadabin
  • jiadabin
  • 2015-01-14 18:25
  • 598
    个人资料
    • 访问:185674次
    • 积分:3456
    • 等级:
    • 排名:第12286名
    • 原创:104篇
    • 转载:50篇
    • 译文:14篇
    • 评论:37条
    博客专栏
    文章分类
    站长统计