定义
当一个对象的内在状态改变时允许改变其行为,这个对象看起来好像修改了它的类。
状态模式,将状态封装成独立的类,并将动作委托到代表当前状态的对象。
使用场景
- 一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为;
- 代码中包含大量与对象状态有关的条件语句,比如,一个操作中含有庞大的多分支语句(ifelse或switchcase),且这些分支依赖于该对象的状态。
UML类图
Context:上下文环境类,维护一个State子类的实例,这个实例定义了对象的当前状态;
State:抽象状态类或者状态接口,定义一个或者一组接口,表示该状态下的行为;
ConcreteStragetyA、ConcreteStragetyB:具体的状态类,每一个具体的状态类实现抽象State中定义的接口,从而达到不同状态下的不同行为。
代码实现
public class Client {
public interface TvState {
void nextChannel();
void prevChannel();
void turnUp();
void turnDown();
}
public static class PowerOnState implements TvState {
@Override
public void nextChannel() {
System.out.println("next channel");
}
@Override
public void prevChannel() {
System.out.println("previous channel");
}
@Override
public void turnUp() {
System.out.println("turn up");
}
@Override
public void turnDown() {
System.out.println("turn down");
}
}
public static class PowerOffState implements TvState {
@Override
public void nextChannel() {
}
@Override
public void prevChannel() {
}
@Override
public void turnUp() {
}
@Override
public void turnDown() {
}
}
public interface PowerController {
void powerOn();
void powerOff();
}
public static class TvController implements PowerController {
TvState tvState;
private void setTvState(TvState tvState) {
this.tvState = tvState;
}
@Override
public void powerOn() {
setTvState(new PowerOnState());
System.out.println("power on");
}
@Override
public void powerOff() {
setTvState(new PowerOffState());
System.out.println("power off");
}
public void nextChannel() {
tvState.nextChannel();
}
public void prevChannel() {
tvState.prevChannel();
}
public void turnUp() {
tvState.turnUp();
}
public void turnDown() {
tvState.turnDown();
}
}
public static void main(String[] args) {
TvController tvController = new TvController();
tvController.powerOn();
tvController.nextChannel();
tvController.turnUp();
tvController.powerOff();
tvController.turnUp();
}
}
日志打印
power on
next channel
turn up
power off
总结
状态模式和策略模式的结构几乎完全一样,但它们的目的和本质却完全不一样。
优点:
将繁琐的状态判断转换成结构清晰的状态族,在避免代码膨胀的同时也保证了可扩展性与可维护性。
缺点:
增加系统类和对象的个数。