定义
状态模式,即因状态而定,因状态而产生具体行为。状态模式与策略模式极其相似,但是二者却有着天壤之别。状态模式的行为是并列平行存在的,每一个状态都包含所有状态下并行的行为,而策略模式的行为是独立可替换的。
状态模式和策略模式都可以解决重复冗杂的 if else 语句结构,当一个对象的行为取决于它的状态时,便可以使用状态模式解决。
示例
空调的状态包括关机、开机等状态,在不同的状态下某些操作有着不同的行为特征。首先定义一个空调状态基类:
public abstract class AirState {
protected AirController controller;
public abstract void powerOn();
public abstract void powerOff();
public abstract void adjustTemp();
public void setController(AirController controller) {
this.controller = controller;
}
}
关机状态下进行开机、关机、调节温度等操作:
public class ClosedState extends AirState {
@Override
public void powerOn() {
controller.setCurrentState(AirController.STATE_OPEN);
controller.getCurrentState().powerOn();
System.out.println("当前状态为启动状态");
}
@Override
public void powerOff() {
System.out.println("已关闭空调");
}
@Override
public void adjustTemp() {
// no-op
}
}
开机状态下同样要处理这几种行为:
public class OpenState extends AirState {
@Override
public void powerOn() {
System.out.println("已启动空调");
}
@Override
public void powerOff() {
controller.setCurrentState(AirController.STATE_CLOSED);
controller.getCurrentState().powerOff();
System.out.println("当前状态为关闭状态");
}
@Override
public void adjustTemp() {
System.out.println("已调整温度");
}
}
遥控器的角色,就是要控制空调在不同的状态下的行为:
public class AirController {
public static final OpenState STATE_OPEN = new OpenState();
public static final ClosedState STATE_CLOSED = new ClosedState();
private AirState currentState = STATE_CLOSED;
public AirController() {
this.currentState.setController(this);
}
public AirState getCurrentState() {
return currentState;
}
public void setCurrentState(AirState currentState) {
this.currentState = currentState;
currentState.setController(this);
}
public void powerOn() {
currentState.powerOn();
}
public void powerOff() {
currentState.powerOff();
}
public void adjustTemp() {
currentState.adjustTemp();
}
}
public class Client {
public static void main(String[] args) {
AirController controller = new AirController();
controller.powerOn();
controller.adjustTemp();
controller.powerOff();
controller.adjustTemp();
}
}
最后打印出的结果如下:
已启动空调
当前状态为启动状态
已调整温度
已关闭空调
当前状态为关闭状态
Android 中的状态模式场景
比如用户登录系统,在登录和注销的情况下发表评论、收藏等行为有着不同执行轨迹。类似这些需要根据状态进行不同操作的系统业务逻辑,都可以使用状态模式解决。
总结
优点
不言而喻,使得代码结构更加清晰、提高代码扩展性和可维护性。
缺点
产生了过多的对象和方法,当状态对象和行为的数量双向增长时,必然会导致大量的冗余。
本文由
Fynn_ 原创,未经许可,不得转载!
网友评论