浅析Java语言中状态模式的优点
非凡的小笨鱼 人气:0一.介绍
状态模式(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(); } }
四.使用场景
- 行为随状态改变而改变
- 消除复杂的if/else
- 状态类大概率会新增
- 状态类中的方法大概率不会新增
五.状态模式与策略模式对比
状态模式与策略模式的UML类图几乎相同,因此比较一下两者的差异
状态模式状态之间可以存在互相依赖的关系状态之间互相转换,可以反复 策略模式多种算法行为选择一个就能满足算法之间彼此独立
六.优点
减少多重条件判断(使用状态模式可以避免多重条件判断)符合开闭原则(结合工厂模式,生成状态的具体子类对象)状态之间可以自由转换符合单一职责原则(将不同状态的行为分隔开)
加载全部内容