什么是状态模式
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了他的类。
状态模式中的行为是由状态来决定的,不同状态下有不同的行为,状态模式和策略模式的结构几乎完全一样,但他们的目的、本质却完全不同。状态模式的行为是平行不可替换的,策略模式的行为是相互独立可以替换的。
状态模式的适用场景
对象的行为取决于他的状态并随之改变行为。
状态模式用例
电视机和遥控器的关系,开机状态下我们可以切换频道,调节音量等操作,在开机状态下开机无效,关机状态下我们操作音量频道也是无效的。
UML类图
接口TVState:
public interface TVState {
public void nextChannel();
public void preChannel();
public void turnUp();
public void turnDown();
}
实现类PowerOnState:
public class PowerOnState implements TVState {
@Override
public void nextChannel() {
System.out.println("切换到下一频道");
}
@Override
public void preChannel() {
System.out.println("切换到上一频道");
}
@Override
public void turnUp() {
System.out.println("调大音量");
}
@Override
public void turnDown() {
System.out.println("调小音量");
}
}
实现类PowerOffState:
public class PowerOffState implements TVState {
@Override
public void nextChannel() {
// TODO Auto-generated method stub
}
@Override
public void preChannel() {
// TODO Auto-generated method stub
}
@Override
public void turnUp() {
// TODO Auto-generated method stub
}
@Override
public void turnDown() {
// TODO Auto-generated method stub
}
}
接口PowerControllor:
public interface PowerControllor {
public void powerOn();
public void powerOff();
}
实现类TVControllor:
public class TVControllor implements PowerControllor,TVState {
TVState mState;
public void setTVState(TVState mTVState){
this.mState = mTVState;
}
@Override
public void powerOn() {
setTVState(new PowerOnState());
System.out.println("开机了");
}
@Override
public void powerOff() {
setTVState(new PowerOffState());
System.out.println("关机了");
}
@Override
public void nextChannel() {
mState.nextChannel();
}
@Override
public void preChannel() {
mState.preChannel();
}
@Override
public void turnUp() {
mState.turnUp();
}
@Override
public void turnDown() {
mState.turnDown();
}
}
测试类:
public class Test {
public static void main(String[] args) {
TVControllor tvControllor = new TVControllor();
//开机
tvControllor.powerOn();
//切换频道
tvControllor.nextChannel();
//调高音量
tvControllor.turnUp();
//关机
tvControllor.powerOff();
//调高音量,因为是关机状态,此时不再生效
tvControllor.turnUp();
}
}
运行结果:
开机了
切换到下一频道
调大音量
关机了
状态模式总结
状态模式的关键在于对于不同的状态下对同一行为有不同的响应。
状态模式的优点:避免代码膨胀同时也保证了可扩展性。
状态模式的缺点:会增加系统类和对象数量