状态模式
概述
- 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像改变了其类。
- 状态模式和策略模式的结构比较类似,但是它们所解决的问题是不同的。
- 状态模式中类有状态,状态的修改会改变整个类行为。
- 策略模式没有状态,策略的选择由客户端决定。
角色介绍
- 环境角色:定义客户端所需要的接口,负责具体状态的切换。
- 抽象状态类,定义状态方法。
- 具体状态类,继承于抽象状态类,实现其具体的方法。
基本实现
传统模式实现
public class TVController {
//开机状态
private final static int POWER_ON = 1;
//关机状态
private final static int POWER_OFF = 2;
private int mState = POWER_OFF;
public void powerOn() {
mState = POWER_ON;
if (mState == POWER_ON) {
System.out.println("开机");
}
}
public void powerOff() {
mState = POWER_OFF;
if (mState == POWER_OFF) {
System.out.println("关机");
}
}
public void nextChannel() {
if (mState == POWER_ON) {
System.out.println("下一个频道");
} else {
System.out.println("还没有开机呢");
}
}
public void prevChannel() {
if (mState == POWER_ON) {
System.out.println("上一个频道");
} else {
System.out.println("还没有开机呢");
}
}
public void turnUp() {
if (mState == POWER_ON) {
System.out.println("调高音量");
} else {
System.out.println("还没有开机呢");
}
}
public void turnDown() {
if (mState == POWER_ON) {
System.out.println("降低音量");
} else {
System.out.println("还没有开机呢");
}
}
}
public class Demo2 {
public static void main(String[] args) {
TVController controller = new TVController();
controller.powerOn();
controller.nextChannel();
controller.turnDown();
controller.powerOff();
controller.nextChannel();
controller.turnDown();
}
}
开机
下一个频道
降低音量
关机
还没有开机呢
还没有开机呢
状态模式实现
抽象状态类
public interface TVState {
void nextChannel();
void prevChannel();
void turnUp();
void turnDown();
}
具体状态类
//开机状态
public class PowerOnState implements TVState {
@Override
public void nextChannel() {
System.out.println("下一个频道");
}
@Override
public void prevChannel() {
System.out.println("上一个频道");
}
@Override
public void turnUp() {
System.out.println("调高音量");
}
@Override
public void turnDown() {
System.out.println("降低音量");
}
}
//关机状态
public class PowerOffState implements TVState {
@Override
public void nextChannel() {
System.out.println("还没有开机呢");
}
@Override
public void prevChannel() {
System.out.println("还没有开机呢");
}
@Override
public void turnUp() {
System.out.println("还没有开机呢");
}
@Override
public void turnDown() {
System.out.println("还没有开机呢");
}
}
环境角色
public interface PowerController {
void powerOn();
void powerOff();
}
public class TVController implements PowerController {
private TVState mTVState;
public void setTVState(TVState state) {
mTVState = state;
}
@Override
public void powerOn() {
setTVState(new PowerOnState());
System.out.println("开机");
}
@Override
public void powerOff() {
setTVState(new PowerOffState());
System.out.println("关机");
}
public void nextChannel() {
mTVState.nextChannel();
}
public void prevChannel() {
mTVState.prevChannel();
}
public void turnUp() {
mTVState.turnUp();
}
public void turnDown() {
mTVState.turnDown();
}
}
使用
public class Demo {
public static void main(String[] args) {
TVController tvController = new TVController();
tvController.powerOn();
tvController.nextChannel();
tvController.turnUp();
tvController.powerOff();
tvController.nextChannel();
}
}
开机
下一个频道
调高音量
关机
还没有开机呢