状态模式(State pattern)
什么是状态模式呢?所谓的状态模式,指的是对于同一个对象而言,不同的状态对应着
不同的行为,同时,这些状态和行为之间是可以转化的,由一个状态转向另外的一个状态。其实这样的例子生活中是很多的。
最常见的应该是红绿灯了。一共有三个状态。其中,红灯表示的是不可以通过,黄灯表示的是警告,绿灯表示的是可以通行。这是是同一个对象对应着不同的状态,不同的状态又表示的是不同的行为。
再比如我们的房间的预订。房间的状态也有三个。空闲,预订,已入住三个状态。这几个状态之间是可以相互转化的。就比如下面的图所示:
当然我们首先想到的应该是使用if ,else if ,else.但是这种办法明显是不够好的。
所以当我们遇到这种需要频繁修改对象的状态的时候,那么我们就可以考虑使用状态模式了。
那么什么是状态模式呢?
首先,我们需要定义的是一个抽象的状态类State.而State又有几个实现了它的接口的抽象类。并且特别需要注意的是,Context类中拥有State类的一个引用。所以说,这个Context类的作用是定义了当前的状态。这是要注意的。
那么具体来说,我们如何来实现呢?
package com.bjsxt.state;
public interface State {
void handle();
}
package com.bjsxt.state;
/**
* 空闲状态
* @author Administrator
*
*/
public class FreeState implements State {
@Override
public void handle() {
System.out.println("房间空闲!!!没人住!");
}
}
package com.bjsxt.state;
/**
* 已预订状态
* @author Administrator
*
*/
public class BookedState implements State {
@Override
public void handle() {
System.out.println("房间已预订!别人不能定!");
}
}
package com.bjsxt.state;
/**
* 已入住状态
* @author Administrator
*
*/
public class CheckedInState implements State {
@Override
public void handle() {
System.out.println("房间已入住!请勿打扰!");
}
}
package com.bjsxt.state;
/**
* 房间对象
* @author Administrator
*
*/
//其实这个类表示的应该是一个房间类。
public class HomeContext {
//如果是银行系统,这个Context类就是账号。根据金额不同,切换不同的状态!
//比如说是什么白金状态,VIP状态等。
private State state;
public void setState(State s){
System.out.println("修改状态!");
state = s;
state.handle();
}
}
package com.bjsxt.state;
public class Client {
public static void main(String[] args) {
HomeContext ctx = new HomeContext();
ctx.setState(new FreeState());
ctx.setState(new BookedState());
}
}