首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

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

2013-01-27 
还是设计模式,state模式是否只对复杂的数量又少的工程管用?本帖最后由 elemusic 于 2011-09-24 15:49:23

还是设计模式,state模式是否只对复杂的数量又少的工程管用?
本帖最后由 elemusic 于 2011-09-24 15:49:23 编辑 这个感觉像是状态机的东西,感觉只是把各种条件化成单个类来实现了。

实际上对于代码少或者不太复杂的情况,用个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模式写代码也太累了吧........
[解决办法]
引用:
但是效率和代码量是不是差的有点多?state要都封装成类,这值得么?特别是状态很多的情况?


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

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


- 千里孤行

热点排行