状态设计模式
1. 简单介绍
状态模式(State)是一种行为型设计模式。当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类。简单来说就是,一个含有多种状态的实例,其行为随状态的变化而变化。
2. 使用场景
- 当控制一个对象状态转换的条件表达式过于复杂时,采用状态模式把状态的判断逻辑转移到表示不同状态的一系列类当中,起到判断逻辑简单化的作用
3. 场景举例
电商购物时,订单的状态有非常多,如果单纯的通过if-else进行状态的判断后,进行后续操作,则代码的可维护性不高。此时可以通过状态模式,将订单的各个状态进行抽象。具体的状态下的操作,可以封装到对应的状态类型,从而将复杂的if-else判断逻辑简单化。
4. UML类图
5. 具体实现
描述
- 背景:网购时,订单的存在多种状态。通过状态模式,来模拟订单在不同的操作后,订单的状态变化。
- 订单的状态:待付款(订单初始状态)、代发货、待收货、待评价、已完结
- 订单的操作:付款(状态变为待发货)、取消订单(状态变为已完结)、发货(状态变为待收货)、收货(状态变为待评价)、评价(状态变为已完结)
- PendingPaymentState:待付款状态类,此时可以对订单进行取消和付款
- ToBeDeliveredState:待发货状态,订单在该状态下只能进行发货操作
- ToBeReceivedState:待收货状态,该状态只能进行收货操作
- CommentState:待评价状态,订单在该状态下只能进行评价操作
- FinishedState:订单完结状态,订单无法进行任何操作
- Client:客户端
状态转移图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ag4EdRrU-1586312336192)(./images/状态转移图.png)]
代码实现
State.java
/**
* 状态接口,状态的变化对应其中某一个接口
*/
public interface State {
/**
* 付款
*/
void payment() throws Exception;
/**
* 取消订单
*/
void cancel() throws Exception;
/**
* 发货
*/
void ship() throws Exception;
/**
* 收货
*/
void receipt() throws Exception;
/**
* 评价
*/
void evaluate() throws Exception;
/**
* 获取当前状态描述
*/
String getCurrentState();
}
AbstractState.java
/**
* 抽象状态类,起到适配作用
*/
public abstract class AbstractState implements State {
protected Order order;
public AbstractState(Order order) {
this.order = order;
}
@Override
public void payment() throws Exception {
System.out.println(order.getCurrentState() + "无法进行付款操作,请先提交订单");
throw new Exception();
}
@Override
public void cancel() throws Exception {
System.out.println(order.getCurrentState() + "无法进行取消操作");
throw new Exception();
}