介绍
行为是由状态决定的,当一个对象内在的状态改变时允许改变其行为这个对象看起来像是改变其累
应用场景
- 一个对象的行为取决于他的状态,并且他必须在运行时更具状态改变其累;
- 代码中包含大量与对象状态相关的条件语句,
UML
代码
显示生活中,遥控器会更具状态判断执行不同的命令,在开机的状态可以上下频道,音量高低,关机则不可以
- 普通实现
public class TvController {
//电视开启
public static final int TV_ON = 0;
//电视关闭
public static final int TV_OFF = 1;
private int tvStatus = TV_OFF;
public void tvON() {
if (tvStatus == TV_OFF) {
tvStatus = TV_ON;
System.out.println("开机了");
}
}
public void tvOFF() {
if (tvStatus == TV_ON) {
tvStatus = TV_OFF;
System.out.println("关机了");
}
}
public void nextChannel() {
if (tvStatus == TV_ON) {
System.out.println("下一个频道");
}
}
public void prevChannel() {
if (tvStatus == TV_ON) {
System.out.println("下一个频道");
}
}
public void turnUp() {
if (tvStatus == TV_ON) {
System.out.println("下一个频道");
}
}
public void turnDown() {
if (tvStatus == TV_ON) {
System.out.println("下一个频道");
}
}
}
- 使用状态模式
电视操作接口
public interface TvStatus {
void nextChannel();
void prevChannel();
void turnUp();
void turnDown();
}
关机状态实现
public class TvOffState implements TvStatus {
@Override
public void nextChannel() {
}
@Override
public void prevChannel() {
}
@Override
public void turnUp() {
}
@Override
public void turnDown() {
}
}
开机状态实现
public class TvOnState implements TvStatus {
@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 TvControllerState implements PowerController {
TvStatus tvStatus;
public void setTvStatus(TvStatus tvStatus) {
this.tvStatus = tvStatus;
}
@Override
public void powerOn() {
setTvStatus(new TvOnState());
System.out.println("开机了");
}
@Override
public void powerOff() {
setTvStatus(new TvOffState());
System.out.println("关机了");
}
public void nextChannel() {
tvStatus.nextChannel();
}
public void prevChannel() {
tvStatus.prevChannel();
}
public void turnUp() {
tvStatus.turnUp();
}
public void turnDown() {
tvStatus.turnDown();
}
}
总结
状态模式的关键在于不同的转态下对于同一行为有不同的相应,这其实就是一个将if - else用多态实现的具体事例,这使得逻辑耦合在一起,易于出错,通过状态模式可以消除,避免代码的膨胀,提高可扩展和可维护性。