定义
状态模式中,行为是由状态来决定的,不同状态下有不同行为。状态模式和策略模式的结构几乎是一模一样的,主要是他们表达的目的和本质是不同。
示例
public interface TvState {
public void nextChannel();
public void prevChannel();
public void turnUp();
public void turnDown();
}
public class PowerOffState implements TvState {
public void nextChannel() {
out.println("power off, can't receive signal !");
}
public void prevChannel() {
out.println("power off, can't receive signal !");
}
public void turnUp() {
out.println("power off, can't receive signal !");
}
public void turnDown() {
out.println("power off, can't receive signal !");
}
}
public class PowerOnState implements TvState {
public void nextChannel() {
System.out.println("power on, 接收到信号:下一频道");
}
public void prevChannel() {
System.out.println("power on, 接收到信号:上一频道");
}
public void turnUp() {
System.out.println("power on, 接收到信号:调高音量");
}
public void turnDown() {
System.out.println("power on, 接收到信号:调低音量");
}
}
public class TvSet{
public TvSet(TvState state) {
setmTvState(state);
}
public TvState getmTvState() {
return mTvState;
}
public void setmTvState(TvState mTvState) {
this.mTvState = mTvState;
}
private TvState mTvState;
}
public class TvController {
public void nextChannel(TvState mTvState) {
mTvState.nextChannel();
}
public void prevChannel(TvState mTvState) {
mTvState.prevChannel();
}
public void turnUp(TvState mTvState) {
mTvState.turnUp();
}
public void turnDown(TvState mTvState) {
mTvState.turnDown();
}
}
public class ClientUser{
public void testUserAction(){
TvController mTvController = new TvController();
TvSet tv = new TvSet(new PowerOffState());
out.println("tv power off");
mTvController.turnUp(tv.getmTvState());
mTvController.turnDown(tv.getmTvState());
mTvController.prevChannel(tv.getmTvState());
mTvController.nextChannel(tv.getmTvState());
out.println("tv power on");
tv.setmTvState(new PowerOnState());
mTvController.turnUp(tv.getmTvState());
mTvController.turnDown(tv.getmTvState());
mTvController.prevChannel(tv.getmTvState());
mTvController.nextChannel(tv.getmTvState());
}
}
Android中的实例
Android源码中很多地方都有用到状态模式,举一个例子,就是Android的WIFI管理模块。
当WIFI开启时,自动扫描周围的接入点,然后以列表的形式展示;当wifi关闭时则清空。这里wifi管理模块就是根据不同的状态执行不同的行为。
Phone模块中,Framework层中接收RIL模块消息,对SMS消息处理,也使用了状态模式。
详细见StateMachine.java,InboundSmsHandler.java,GsmInboundSmsHandler.java。
StateMachine类是Android系统封装的层次状态机类, 从Goolge给出的解释:The state machine defined here is a hierarchical state machine which processes messages and can have states arranged hierarchically. 在Android世界里,StateMachine也叫做层次状态机,简称HSM,这里的HSM主要用来处理消息并且分层次管理其状态。。