定义:状态模式允许一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类一样
场景:一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为;操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。
例子: 订单系统中的状态
// 需要优化的代码
public String orderState(String state) {
if (state.equals("0")) {
return "已经发货";
}
if (state.equals("1")) {
return "正在运送中...调用第三方快递接口 展示 运送信息";
}
if (state.equals("2")) {
return "正在派送中... 返回派送人员信息";
}
if (state.equals("3")) {
return "已经签收,提示给用户快递员评价";
}
if (state.equals("4")) {
return "拒绝签收, 重新开始申请退单";
}
if (state.equals("5")) {
return "订单交易失败,调用短信接口提示 ";
}
return "未找到对应的状态";
}
}
// 状态接口
public interface OrderState {
Object orderService();
}
public class AlreadySignedOrderState implements OrderState {
@Override
public Object orderService() {
log.info(">> 切换已经签收状态..");
return "切换已经签收状态";
}
}
public class InTransitOrderState implements OrderState {
@Override
public Object orderService() {
log.info(">> 切换为正在运送状态..");
return "切换为正在运送状态";
}
}
public class ShippedAlreadyOrderState implements OrderState {
@Override
public Object orderService() {
log.info(">> 切换为已经发货状态..");
return "切换为已经发货状态";
}
}
// 调用状态的对象
public class StateContext {
private OrderState orderState;
public StateContext(OrderState orderState) {
this.orderState = orderState;
}
public void switchStateOrder() {
orderState.orderService();
}
}
// 测试
public class Test {
public static void main(String[] args) {
StateContext stateContext = new StateContext(new ShippedAlreadyOrderState());
stateContext.switchStateOrder();
}
}
状态模式与策略模式区别:
状态模式重点在各状态之间的切换从而做不同的事情,而策略模式更侧重于根据具体情况选择策略,并不涉及切换;
状态模式封装了对象的状态,而策略模式封装算法或策略。