定义:
当一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类一样。又称状态对象模式,状态模式是对象的行为模式。
使用场景:
- 一个对象的行为取决于他的状态,并且他必须在运行时根据状态改变他的行为
- 代码中包含大量与对象相关的条件语句,例如一个操作中含有多分支语句。这些分支历来与该对象
- 状态模式将每一个条件分支放入一个独立类中,这使得你可以根据对象自身的情况将状态作为一个对象。这一对象可以不依赖于其他对象而独立变化。这样通过过多的,重复的if-else分支语句
案例(电视剧开关机 和选择上一个和下一个频道)
- 抽象状态(State)角色
//定义一个接口,用以封装环境(Context)对象的一个特定的状态所对应的行为。
public interface TvState {
void nextChannel();//下一个频道
void preChannel();//上一个频道
void turnOn();//开机
void turnOff();//关机
}
- 具体状态(ConcreteState)角色
每一个具体状态类都实现了环境(Context)的一个状态所对应的行为。
//关机状态
public class PowerOffState implements TvState {
@Override
public void nextChannel() {
System.out.print("无效"+"\n");
}
@Override
public void preChannel() {
System.out.print("无效"+"\n");
}
@Override
public void turnOn() {
System.out.print("无效"+"\n");
}
@Override
public void turnOff() {
System.out.print("关机了"+"\n");
}
}
//开机状态下
public class PowerOnState implements TvState {
@Override
public void nextChannel() {
System.out.print("下一个频道"+"\n");
}
@Override
public void preChannel() {
System.out.print("上一个频道"+"\n");
}
@Override
public void turnOn() {
System.out.print("开机了"+"\n");
}
@Override
public void turnOff() {
System.out.print("关机了"+"\n");
}
}
- 环境(Context)角色
//上下文:定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。这个定义了对象的当前状态
public class TvControl {
TvState mTvState;
public void setState(TvState mTvState){
this.mTvState=mTvState;
}
public void powerOn(){
setState(new PowerOnState());//开机
mTvState.turnOn();
}
public void powerOff(){
setState(new PowerOffState());//关机
mTvState.turnOff();
}
public void nextChannel() {
mTvState.nextChannel();//上一个频道
}
public void preChannel() {
mTvState.preChannel();//下一个频道
}
public void turnOn() {
mTvState.turnOn();//开机
}
public void turnOff() {
mTvState.turnOff();//关机
}
}
- 客户端调用
public class MyClass {
public static void main(String[] args){
TvControl tvControl=new TvControl();
tvControl.powerOn();//开机
tvControl.nextChannel();//下一个频道
tvControl.preChannel();//上一个频道
tvControl.powerOff();//关机
tvControl.powerOff();//关机
}
}
开机了
下一个频道
上一个频道
关机了
关机了