一.介绍
状态模式(State Pattern)属于行为型模式。当控制一个对象状态转换的条件表达式过于复杂时,把相关判断逻辑提取出来,用各个不同的状态类进行表示,系统处于哪种状态,直接使用相应的状态类对象进行处理,从而消除if/else、switch/case语句
二.UML类图
定义了多个状态,每个状态类仅实现自己的逻辑,由环境类负责切换状态
三.示意代码
业务代码
public class Car {
private CarState carState;
public Car(CarState carState) {
this.carState = carState;
}
public void setCarState(CarState carState) {
this.carState = carState;
}
public void openDoor(){
carState.openDoor();
}
public void closeDoor(){
carState.closeDoor();
}
public void runCar(){
carState.runCar();
}
}
abstract class CarState{
public abstract void openDoor();
public abstract void closeDoor();
public abstract void runCar();
}
class OpenState extends CarState{
@Override
public void openDoor() {
System.out.println("can not open the door");
}
@Override
public void closeDoor() {
System.out.println("close the door success");
}
@Override
public void runCar() {
System.out.println("can not run the car");
}
}
class CloseState extends CarState{
@Override
public void openDoor() {
System.out.println("open the door success");
}
@Override
public void closeDoor() {
System.out.println("can not close the door");
}
@Override
public void runCar() {
System.out.println("run the car success");
}
}
客户端
public class Client {
public static void main(String[] args) {
CarState state = new CloseState();
Car car = new Car(state);
car.openDoor();
car.setCarState(new OpenState());
car.runCar();
}
}
四.使用场景
五.状态模式与策略模式对比
状态模式与策略模式的UML类图几乎相同,因此比较一下两者的差异
六.优点
- 减少多重条件判断(使用状态模式可以避免多重条件判断)
- 符合开闭原则(结合工厂模式,生成状态的具体子类对象)
- 状态之间可以自由转换
- 符合单一职责原则(将不同状态的行为分隔开)
|