介绍
状态模式中的行为是由状态来决定的,不同的状态下有不同的行为。状态模式和策略模式的结构几乎完全一样,但他们的目的、本质却完全不同不一样。状态模式的行为是平行的、不可替换的,策略模式的行为是彼此独立、可替换的。
定义
当一个对象的内在状态改变时允许改变其行为,这个对象看起来是改变了其类。
使用场景
1、一个对象的行为取决于他的状态,并且它必须运行时根据状态改变它的行为。
2、代码中大量与对象状态有关的条件语句,例如,一个操作中含有庞大的多分支语句(if-else或switch-case),且这些分支依赖于该对象的状态。
UML类图
代码
第一版本:
TvController.java
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_OFF){
System.out.println("开机啦");
}
}
public void powerOFF(){
mState=POWER_OFF;
if(mState==POWER_ON){
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 trunUp(){
if(mState==POWER_ON){
System.out.println("调高音量");
}else{
System.out.println("亮个红灯提示没有开机");
}
}
public void trunDown(){
if(mState==POWER_ON){
System.out.println("调低音量");
}else{
System.out.println("亮个红灯提示没有开机");
}
}
}
第二版:
TvState.java
public interface TvState {
public void nextChannel();
public void prevChannel();
public void turnUp();
public void turnDown();
}
TvController.java
public interface PowerController {
public void powerOn();
public void powerOff();
}
TvStateController.java
public class TvController implements PowerController{
TvState mTvState;
public void setTvState(TvState mTvState){
this.mTvState=mTvState;
}
@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();
}
}
PowerOnState.java
public class PowerOffState implements TvState {
@Override
public void nextChannel(){
}
@Override
public void prevChannel(){
}
@Override
public void turnUp(){
}
@Override
public void turnDown(){
}
}
PowerOnState.java
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("调低音量");
}
}
Client.java
public class Client {
public static void main(String[] args){
TvController tvController=new TvController();
tvController.powerOn();
tvController.nextChannel();
tvController.turnUp();
tvController.powerOff();
tvController.turnDown();
}
}
运行结果: