您的位置:首页 > 编程语言

设计模式简单代码之State模式

2006-08-14 12:36 387 查看
使用State模式,一言以蔽之,技术上就是使用委托来动态改变类的行为。而语义上就是在运行时改变一个类的状态。
下面我们使用State模式来模拟交通灯的状态变化。
交通灯就是有三种的状态变化:红黄绿,而变化的循环是:红->黄->绿->黄->红。
代码如下:


#include <iostream>


using namespace std;




class State




...{


public:


virtual void Run() = 0;


};




class RedState : public State




...{


public:


void Run()




...{


cout << "红 " << endl;


}


};




class YellowState : public State




...{


public:


void Run()




...{


cout << "黄 " << endl;


}


};




class GreenState : public State




...{


public:


void Run()




...{


cout << "绿 " << endl;


}


};




class TrafficLight




...{


public:


TrafficLight()




...{


// 刚出厂的灯,运行次数为0


_nCnt = 0;




// 只能运行100次,质量真差


_nTotalCnt = 100;


}




// 设置状态


void SetState(State *s)




...{


_state = s;


}






void Run()




...{


_state->Run();


_nCnt++;


}




// 灯是否坏了


bool IsBad()




...{


if(_nCnt > _nTotalCnt)




...{


cout << "灯坏了" << endl;


return true;


}




return false;


}


private:


State *_state;




// 表示灯的运行次数,任何设备都有消耗,即有个寿命,所以,灯在运行了一段较长的时间之后,


// 就会坏了


int _nCnt; // 当前运行的次数


int _nTotalCnt; // 总寿命


};






// 实例:动态改变交通灯的状态


void main()




...{


// 有一个交通灯


TrafficLight tl;




// 三种状态


RedState rs;


GreenState gs;


YellowState ys;




while (!tl.IsBad())




...{


// 控制状态的变化


tl.SetState(&rs);


tl.Run();


tl.SetState(&ys);


tl.Run();


tl.SetState(&gs);


tl.Run();


}


}

总的来说,State模式比较简单,主要是用了委托的技术。我们在现实中如果碰到状态的变化的时候,都可以考虑使用这个模式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: