网络服务器软件开发
C++博客
首页
新随笔
联系
聚合
管理
84 Posts :: 3 Stories :: 50 Comments :: 0 Trackbacks
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(1)
给我留言
查看公开留言
查看私人留言
随笔分类
ACE(6)
boost(4)
C++基础(12)
CORBA(1)
Design Pattern(1)
ebook(1)
java(1)
linux(17)
mysql(5)
python(4)
STL(1)
VC/MFC/.NET(1)
办公技巧(2)
编码知识(5)
创意&想法(1)
开发感想(6)
理财(2)
其它开源库(8)
生活感想(9)
数据结构算法(1)
通信技术(5)
网络编程模型(4)
随笔档案
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)
搜索
积分与排名
积分 - 25609
排名 - 91
最新评论
1. re: Asio实现的实用echo server
评论内容较长,点击标题查看
--roger007
2. re: 怪异的boost,fatal error LNK1104: 无法打开文件“libboost_system-vc80-mt-gd-1_35.lib”
把boost lib里面的boost_system-vc80-mt-gd-1_35.lib等等该名字成libboost_system-vc80-mt-gd-1_35.lib就好了
--victording
3. re: Asio实现的实用echo server
python做网络测试确实不错
c++的网络库一抓一大把,而且质量都不错
--haskell
4. re: 几只股票
600499科达机电-多头行情中,且有加速上涨趋势
600506香梨股份-处于回落整理阶段,且回落有加速趋势
--true
5. re: 几只股票
002109兴化股份-没有主力或主力控股程度低
--true
阅读排行榜
1. Asio实现的实用echo server(1134)
2. State模式的应用探讨(1101)
3. boost interprocess之message queue(1072)
4. Xerces C++ 学习笔记[转](1022)
5. boost 1-35编译(976)
评论排行榜
1. 怪异的boost,fatal error LNK1104: 无法打开文件“libboost_system-vc80-mt-gd-1_35.lib”(10)
2. 为什么很多人喜欢在代码中写错别字呢(5)
3. std::queue的front的问题(3)
4. ldconfig几个需要注意的地方 zhuan(3)
5. boost 1-35编译(3)
60天内阅读排行
1. Asio实现的实用echo server(1134)
2. boost interprocess之message queue(1072)
3. boost 1-35编译(976)
4. 怪异的boost,fatal error LNK1104: 无法打开文件“libboost_system-vc80-mt-gd-1_35.lib”(265)
5. 【ZT】ADSL大型技术专题(图文)(213)
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;