狀態(tài)模式
GOF對(duì)于狀態(tài)模式的定義是:“當(dāng)一個(gè)對(duì)象的內(nèi)在狀態(tài)改變時(shí)允許改變其行為,這個(gè)對(duì)象看起來(lái)像是改變了其類导匣≮迤”
狀態(tài)模式的好處就是將與特定狀態(tài)相關(guān)的行為進(jìn)行局部化,并且將不同狀態(tài)的行為進(jìn)行分割涕俗。也就是將特定的與該狀態(tài)相關(guān)的行為都放進(jìn)一個(gè)對(duì)象之中,由于所有與狀態(tài)有關(guān)的代碼都存在于某個(gè)具體的狀態(tài)類中神帅,所以通過(guò)定義新的具體狀態(tài)類就可以很容易地添加新的狀態(tài)和轉(zhuǎn)換咽袜。
下面以列車的狀態(tài)為例,上代碼
package State;
public class Train {
private State currentState;
public Train()
{
currentState = new StartState();
}
private int speed;
private boolean giveWay = false;
public void setState(State state)
{
currentState = state;
}
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
this.speed = speed;
}
public boolean isGiveWay() {
return giveWay;
}
public void setGiveWay(boolean giveWay) {
this.giveWay = giveWay;
}
public void Run()
{
currentState.Run(this);
}
}
package State;
public abstract class State {
public abstract void Run(Train train);
}
package State;
public class StartState extends State{
@Override
public void Run(Train train) {
// TODO Auto-generated method stub
if(train.getSpeed() == 0)
{
System.out.println("當(dāng)前時(shí)速為:" + train.getSpeed()
+ "列車開始啟動(dòng)");
}
else
{
train.setState(new FastState());
train.Run();
}
}
}
package State;
public class FastState extends State{
@Override
public void Run(Train train) {
// TODO Auto-generated method stub
if(train.getSpeed() < 200)
{
System.out.println("當(dāng)前時(shí)速為:" + train.getSpeed()
+ "列車正在加速");
}
else
{
train.setState(new SlowState());
train.Run();
}
}
}
package State;
public class SlowState extends State{
@Override
public void Run(Train train) {
// TODO Auto-generated method stub
if(train.getSpeed() > 200)
{
System.out.println("當(dāng)前時(shí)速為:" + train.getSpeed()
+ "列車正在減速");
}
else
{
train.setState(new RunState());
train.Run();
}
}
}
package State;
public class RunState extends State{
@Override
public void Run(Train train) {
// TODO Auto-generated method stub
if(train.isGiveWay())
{
train.setState(new StopState());
train.Run();
}
else
{
System.out.println("當(dāng)前時(shí)速為:" + train.getSpeed()
+ "列車正在勻速行駛");
}
}
}
package State;
public class StopState extends State{
@Override
public void Run(Train train) {
// TODO Auto-generated method stub
System.out.println("當(dāng)前時(shí)速為:" + train.getSpeed()
+ "列車正在停止枕稀,準(zhǔn)備讓行");
}
}
package State;
public class client {
public static void main(String[] args) {
// TODO Auto-generated method stub
Train train = new Train();
train.setSpeed(0);
train.Run();
train.setSpeed(100);
train.Run();
train.setSpeed(150);
train.Run();
train.setSpeed(210);
train.Run();
train.setSpeed(200);
train.Run();
train.setGiveWay(true);;
train.Run();
}
}
一個(gè)對(duì)象的狀態(tài)指的就是這個(gè)對(duì)象的屬性值的組合,如果我們改變了這些屬性的任意一個(gè)谜嫉,這個(gè)對(duì)象的狀態(tài)就發(fā)生了改變萎坷。
狀態(tài)模式適用于以下情況:
- 一個(gè)對(duì)象的行為取決于它的狀態(tài),并且他必須在運(yùn)行時(shí)刻根據(jù)狀態(tài)來(lái)改變自己的行為
- 當(dāng)一個(gè)操作含有大量的多分支條件語(yǔ)句沐兰,并且這些分支都依賴于對(duì)象的狀態(tài)時(shí)哆档。