还是设计模式,state模式是否只对复杂的数量又少的工程管用?

elemusic 2011-09-24 03:48:24
这个感觉像是状态机的东西,感觉只是把各种条件化成单个类来实现了。

实际上对于代码少或者不太复杂的情况,用个switch就行了吧?

并且他还是都是用类实例化的。感觉效率是不是还不如switch呢?

因为switch只要根据条件就直接找到对应的代码了。而state,多了一堆没用的二次判断。如果状态比较多,效率是否更差了?

比如


//测试案例
int main()
{
War *war = new War(new ProphaseState());
for(int i = 1; i < 40;i += 5)
{
war->SetDays(i);
war->GetState();
}
delete war;
return 0;
}

直接从顶层状态传入。

//战争结束  
class EndState: public State
{
public:
void End(War *war) //结束阶段的具体行为
{
cout<<"战争结束"<<endl;
}
void CurrentState(War *war) { End(war); }
};
//后期
class AnaphaseState: public State
{
public:
void Anaphase(War *war) //后期的具体行为
{
if(war->GetDays() < 30)
cout<<"第"<<war->GetDays()<<"天:战争后期,双方拼死一搏"<<endl;
else
{
war->SetState(new EndState());
war->GetState();
}
}
void CurrentState(War *war) { Anaphase(war); }
};
//中期
class MetaphaseState: public State
{
public:
void Metaphase(War *war) //中期的具体行为
{
if(war->GetDays() < 20)
cout<<"第"<<war->GetDays()<<"天:战争中期,进入相持阶段,双发各有损耗"<<endl;
else
{
war->SetState(new AnaphaseState());
war->GetState();
}
}
void CurrentState(War *war) { Metaphase(war); }
};
//前期
class ProphaseState: public State
{
public:
void Prophase(War *war) //前期的具体行为
{
if(war->GetDays() < 10)
cout<<"第"<<war->GetDays()<<"天:战争初期,双方你来我往,互相试探对方"<<endl;
else
{
war->SetState(new MetaphaseState());
war->GetState();
}
}
void CurrentState(War *war) { Prophase(war); }
};



这样下来,比如说我有1000个状态,我想运行第999个状态,要经过999个if,else(这和switch)差不多,但是还有999个new class,这效率会不会很差?

并且如果内容比较简单,比如只是调用几个函数,就封装成一个类,那用state模式写代码也太累了吧........
...全文
80 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
elemusic 2011-09-25
  • 打赏
  • 举报
回复
但是效率和代码量是不是差的有点多?state要都封装成类,这值得么?特别是状态很多的情况?
yanghehong 2011-09-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 elemusic 的回复:]

但是效率和代码量是不是差的有点多?state要都封装成类,这值得么?特别是状态很多的情况?
[/Quote]

效率差别很小,但可读性和可维护性提高,出错概率减小。
如果觉得new一个state对象开销可能 大,可以预先实例化,或者说做成单例(singleton)。

如果状态机太多,比如很多个对象都包含有这样一堆状态的转换,可以考虑把状态从State剥离出来,只要所有对象只需要一个状态机对象和若干State类的一个对象,执行时把状态作为参数传给State就可以了。也就是常说的flyweight 模式,如此降低了内存开销,也没有State构建的开销。


- 千里孤行
yanghehong 2011-09-25
  • 打赏
  • 举报
回复
没错,状态少,内容和逻辑简单是可以用switch来搞,可以不用state模式。

复杂一些的使用state模式,程序可读性和可维护性高一些。


- 千里孤行

3,405

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 设计模式
社区管理员
  • 设计模式
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧