网络服务器软件开发/中间件开发,关注ACE/ICE/boost
C++博客
首页
新随笔
联系
聚合
管理
152 Posts :: 3 Stories :: 172 Comments :: 0 Trackbacks
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(18)
给我留言
查看公开留言
查看私人留言
随笔分类
ACE(12)
boost(6)
C++基础(20)
CORBA(4)
Design Pattern(1)
ebook(1)
ICE(7)
java(1)
linux(28)
mysql(15)
PHP(1)
python(6)
RakNet(1)
SQLite
STL(1)
VC/MFC/.NET(4)
办公技巧(5)
编码知识(8)
创意&想法(2)
开发感想(12)
理财(2)
其它开源库(13)
生活感想(23)
数据结构算法(1)
通信技术(8)
网络服务器开发(9)
游戏开发(4)
随笔档案
2012年7月 (1)
2011年9月 (1)
2011年8月 (1)
2011年5月 (2)
2011年4月 (1)
2011年1月 (9)
2010年12月 (6)
2010年11月 (1)
2010年10月 (3)
2010年9月 (12)
2010年8月 (7)
2010年7月 (1)
2009年10月 (2)
2009年9月 (3)
2009年8月 (1)
2009年3月 (1)
2009年2月 (5)
2009年1月 (6)
2008年12月 (2)
2008年11月 (1)
2008年10月 (1)
2008年9月 (1)
2008年7月 (9)
2008年6月 (10)
2008年5月 (13)
2008年4月 (2)
2008年3月 (3)
2008年1月 (1)
2007年11月 (5)
2007年9月 (1)
2007年8月 (5)
2007年7月 (3)
2007年6月 (2)
2007年5月 (4)
2007年4月 (20)
2007年3月 (6)
文章分类
设计模式
文章档案
2007年3月 (3)
好友博客
LOGOS
搜索
积分与排名
积分 - 233235
排名 - 108
最新评论
1. re: C++实现的MD5算法
你这代码功底也够烂了,你多测试几次,内存哗哗的流...
--热心网页
2. re: std::queue的front的问题[未登录]
在c++中int并不是类,没有析构,是值拷贝。
你换std::string试试,准挂。
--星爷
3. re: mysql下如何执行sql脚本【转】[未登录]
Thanks!
--me
4. re: ldconfig几个需要注意的地方 zhuan
学习了,收藏
--thebye85
5. re: 体验RakNet的RPC3
评论内容较长,点击标题查看
--雅歌
阅读排行榜
1. mysql下如何执行sql脚本【转】(14967)
2. 怪异的boost,fatal error LNK1104: 无法打开文件“libboost_system-vc80-mt-gd-1_35.lib”(11396)
3. boost interprocess之message queue(7055)
4. 【ZT】ADSL大型技术专题(图文)(6894)
5. VOIP开源项目源码地址(二) ---[voip涉及到的所有的资料]【转帖】(5422)
评论排行榜
1. Buffer类就应该简单,直观(16)
2. 怪异的boost,fatal error LNK1104: 无法打开文件“libboost_system-vc80-mt-gd-1_35.lib”(13)
3. 自己造的一个线程类(12)
4. 对基本类型的再包装,方便了移植(12)
5. 游戏害惨了我多少同学(10)
State模式的应用探讨
//直接贴代码吧,欢迎提出缺点及改进方式
//StatePattern.h
#ifndef STATE_PATTERN_H
#define
STATE_PATTERN_H
#include
<
iostream
>
using
namespace
std;
typedef unsigned
char
BYTE;
class
CScenario;
//
decl
class
CSoldier
{
public
:
CSoldier();
~
CSoldier()
{}
;
CScenario
*
GetScenario();
void
ChangeScenario(CScenario
*
scenario);
void
HandleRequest(BYTE
*
req);
//
根据req请求决定采取的动作
protected
:
CScenario
*
_scenario;
}
;
class
CScenario
//
处于的场景
{
public
:
enum
ActionType
{
AT_TELL_ON_ROAD
=
0x01
,
AT_TELL_IN_RIVER
=
0x02
,
AT_TELL_MEET_ENEMY
=
0x04
,
AT_TELL_INFO
=
0x07
,
//
上面三个的"组合"
AT_WALK
=
0x08
,
AT_SWIM
=
0x10
,
AT_FIRE
=
0x20
}
;
public
:
virtual
void
ChangeScenario(CSoldier
*
soldier,CScenario
*
scenario)
{}
virtual
int
GetSupportedAction()
{
return
0
;}
virtual
void
act(CSoldier
*
soldier, ActionType at)
{}
//
采取的动作
virtual
void
Walk()
{}
//
走路
virtual
void
Swim()
{}
//
游泳
virtual
void
Fire()
{}
//
开枪
protected
:
CScenario()
{}
;
}
;
class
CNoOp :
public
CScenario
{
public
:
CNoOp()
{}
static
CScenario
*
Instance();
void
ChangeScenario(CSoldier
*
soldier,CScenario
*
scenario);
int
GetSupportedAction();
void
act(CSoldier
*
soldier,ActionType at);
private
:
static
CScenario
*
_instance;
}
;
class
COnRoad :
public
CScenario
{
public
:
static
CScenario
*
Instance();
void
ChangeScenario(CSoldier
*
soldier,CScenario
*
scenario);
void
Walk();
int
GetSupportedAction();
void
act(CSoldier
*
soldier,ActionType at);
private
:
static
CScenario
*
_instance;
protected
:
COnRoad()
{}
;
//
禁止直接定义对象
}
;
class
CInRiver :
public
CScenario
{
public
:
static
CScenario
*
Instance();
void
ChangeScenario(CSoldier
*
soldier,CScenario
*
scenario);
void
Swim();
int
GetSupportedAction();
void
act(CSoldier
*
soldier,ActionType at);
private
:
static
CScenario
*
_instance;
protected
:
CInRiver()
{}
;
}
;
class
CMeetEnemy :
public
CScenario
{
public
:
static
CScenario
*
Instance();
void
ChangeScenario(CSoldier
*
soldier,CScenario
*
scenario);
void
Fire();
int
GetSupportedAction();
void
act(CSoldier
*
soldier,ActionType at);
private
:
static
CScenario
*
_instance;
protected
:
CMeetEnemy()
{}
;
}
;
#endif
//StatePattern.cpp
#include
"
StatePattern.h
"
CSoldier::CSoldier()
{
this
->
ChangeScenario(CNoOp::Instance());
}
CScenario
*
CSoldier::GetScenario()
{
return
_scenario;
}
void
CSoldier::ChangeScenario(CScenario
*
scenario)
{
this
->
_scenario
=
scenario;
}
void
CSoldier::HandleRequest(BYTE
*
req)
{
if
(req
==
NULL)
{
cout
<<
"
req == NULL
"
<<
endl;
return
;
}
BYTE action
=
*
req;
//
一个字节的Action类型
if
(
!
(action
&
GetScenario()
->
GetSupportedAction()))
//
不支持该Action
{
cout
<<
"
不支持该操作类型
"
<<
endl;
return
;
}
GetScenario()
->
act(
this
,(CScenario::ActionType)action);
return
;
}
//
0.实现CNoOp,作为soldier的初始化状态
CScenario
*
CNoOp::_instance
=
NULL;
CScenario
*
CNoOp::Instance()
{
if
(_instance
==
NULL)
{
_instance
=
new
CNoOp();
}
return
_instance;
}
void
CNoOp::ChangeScenario(CSoldier
*
soldier,CScenario
*
scenario)
{
soldier
->
ChangeScenario(scenario);
return
;
}
int
CNoOp::GetSupportedAction()
{
return
AT_TELL_INFO;
}
void
CNoOp::act(CSoldier
*
soldier,ActionType at)
{
switch
(at)
{
case
AT_TELL_ON_ROAD:
cout
<<
"
---> on road
"
<<
endl;
soldier
->
ChangeScenario(COnRoad::Instance());
break
;
case
AT_TELL_IN_RIVER:
cout
<<
"
---> in river
"
<<
endl;
soldier
->
ChangeScenario(CInRiver::Instance());
break
;
case
AT_TELL_MEET_ENEMY:
cout
<<
"
---> meet enymy
"
<<
endl;
soldier
->
ChangeScenario(CMeetEnemy::Instance());
break
;
default
:
cout
<<
"
unkown action type
"
<<
endl;
break
;
}
return
;
}
//
1.实现COnRoad
CScenario
*
COnRoad::_instance
=
NULL;
CScenario
*
COnRoad::Instance()
{
if
(_instance
==
NULL)
{
_instance
=
new
COnRoad();
}
return
_instance;
}
void
COnRoad::Walk()
{
cout
<<
"
walk
"
<<
endl;
return
;
}
int
COnRoad::GetSupportedAction()
{
return
AT_TELL_INFO
|
AT_WALK;
}
void
COnRoad::ChangeScenario(CSoldier
*
soldier,CScenario
*
scenario)
{
soldier
->
ChangeScenario(scenario);
return
;
}
void
COnRoad::act(CSoldier
*
soldier,ActionType at)
{
switch
(at)
{
case
AT_TELL_ON_ROAD:
cout
<<
"
on road ---> on road
"
<<
endl;
break
;
case
AT_TELL_IN_RIVER:
cout
<<
"
on road ---> in river
"
<<
endl;
soldier
->
ChangeScenario(CInRiver::Instance());
break
;
case
AT_TELL_MEET_ENEMY:
cout
<<
"
on road ---> meets enymy
"
<<
endl;
soldier
->
ChangeScenario(CMeetEnemy::Instance());
break
;
case
AT_WALK:
cout
<<
"
on road : walk now
"
<<
endl;
break
;
default
:
cout
<<
"
unkown action type
"
<<
endl;
break
;
}
return
;
}
//
2.实现CInRiver
CScenario
*
CInRiver::_instance
=
NULL;
CScenario
*
CInRiver::Instance()
{
if
(_instance
==
NULL)
{
_instance
=
new
CInRiver();
}
return
_instance;
}
void
CInRiver::Swim()
{
cout
<<
"
swim
"
<<
endl;
return
;
}
int
CInRiver::GetSupportedAction()
{
return
AT_TELL_INFO
|
AT_SWIM;
}
void
CInRiver::ChangeScenario(CSoldier
*
soldier,CScenario
*
scenario)
{
soldier
->
ChangeScenario(scenario);
return
;
}
void
CInRiver::act(CSoldier
*
soldier,ActionType at)
{
switch
(at)
{
case
AT_TELL_ON_ROAD:
cout
<<
"
in river ---> on road
"
<<
endl;
soldier
->
ChangeScenario(COnRoad::Instance());
break
;
case
AT_TELL_IN_RIVER:
cout
<<
"
in river ---> in river
"
<<
endl;
break
;
case
AT_TELL_MEET_ENEMY:
cout
<<
"
in river : meets enymy
"
<<
endl;
soldier
->
ChangeScenario(CMeetEnemy::Instance());
break
;
case
AT_SWIM:
cout
<<
"
in river : swim now
"
<<
endl;
break
;
default
:
cout
<<
"
unkown action type
"
<<
endl;
break
;
}
return
;
}
//
3.实现CMeetEnemy
CScenario
*
CMeetEnemy::_instance
=
NULL;
CScenario
*
CMeetEnemy::Instance()
{
if
(_instance
==
NULL)
{
_instance
=
new
CMeetEnemy();
}
return
_instance;
}
void
CMeetEnemy::Fire()
{
cout
<<
"
fire
"
<<
endl;
return
;
}
int
CMeetEnemy::GetSupportedAction()
{
return
AT_TELL_INFO
|
AT_FIRE;
}
void
CMeetEnemy::ChangeScenario(CSoldier
*
soldier,CScenario
*
scenario)
{
soldier
->
ChangeScenario(scenario);
return
;
}
void
CMeetEnemy::act(CSoldier
*
soldier,ActionType at)
{
switch
(at)
{
case
AT_TELL_ON_ROAD:
cout
<<
"
meet enemy ---> on road
"
<<
endl;
soldier
->
ChangeScenario(COnRoad::Instance());
break
;
case
AT_TELL_IN_RIVER:
cout
<<
"
meet enemy ---> in river
"
<<
endl;
soldier
->
ChangeScenario(CInRiver::Instance());
break
;
case
AT_TELL_MEET_ENEMY:
cout
<<
"
meet enemy ---> meet enymy
"
<<
endl;
break
;
case
AT_FIRE:
cout
<<
"
meet enemy : fire now
"
<<
endl;
break
;
default
:
cout
<<
"
unkown action type
"
<<
endl;
break
;
}
return
;
}
//StatePatternTest.cpp
//
StateMachine.cpp : Defines the entry point for the console application.
//
#include
<
windows.h
>
#include
"
StatePattern.h
"
int
main(
int
argc,
char
*
argv[])
{
typedef CScenario::ActionType ActionType;
ActionType at;
CSoldier soldier;
//
0.在陆地上
at
=
CScenario::AT_TELL_ON_ROAD;
soldier.HandleRequest((BYTE
*
)
&
at);
//
1.陆地上行走
at
=
CScenario::AT_WALK;
soldier.HandleRequest((BYTE
*
)
&
at);
//
2.遇到敌人,状态改变
at
=
CScenario::AT_TELL_MEET_ENEMY;
soldier.HandleRequest((BYTE
*
)
&
at);
//
3.遇到敌人后开火
at
=
CScenario::AT_FIRE;
soldier.HandleRequest((BYTE
*
)
&
at);
//
4.进入河中,状态改变
at
=
CScenario::AT_TELL_IN_RIVER;
soldier.HandleRequest((BYTE
*
)
&
at);
//
5.河中游泳
at
=
CScenario::AT_SWIM;
soldier.HandleRequest((BYTE
*
)
&
at);
//
5.清理分配资源
delete CNoOp::Instance();
delete COnRoad::Instance();
delete CInRiver::Instance();
delete CMeetEnemy::Instance();
system(
"
pause
"
);
return
0
;
}
posted on 2008-05-26 12:46
true
阅读(1542)
评论(1)
编辑
收藏
引用
所属分类:
Design Pattern
Feedback
#
re: State模式的应用探讨[未登录]
2008-05-26 22:14
steven
不错,受益了
回复
更多评论
刷新评论列表
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
Powered by:
C++博客
Copyright © true