1、什么是状态模式
状态模式就是在一个对象改变状态的时候就让其改变行为,比如说状态 为1的时候就是到店取外卖,转态为2的时候就是送外卖
2、状态模式的应用场景

对象的行为取决于它的状态;
操作中含有较多的条件语句(if判断)
3、具体实现需要
重构的代码
public class OrderService {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 "未找到对应的状态";}}
优化后:
@Componentpublic class SpringUtils implements ApplicationContextAware {private static ApplicationContext applicationContext;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;}//获取applicationContextpublic static ApplicationContext getApplicationContext() {return applicationContext;}//通过name获取 Bean.public static Object getBean(String name){return getApplicationContext().getBean(name);}//通过class获取Bean.public static <T> T getBean(Class<T> clazz){return getApplicationContext().getBean(clazz);}//通过name,以及Clazz返回指定的Beanpublic static <T> T getBean(String name,Class<T> clazz){return getApplicationContext().getBean(name, clazz);}}@RestControllerpublic class OrderController {@RequestMapping("/order")public String order(String stateBeanId) {//1.使用Spring上下文获取bean中对象OrderState orderState = SpringUtils.getBean(stateBeanId, OrderState.class);// 2.使用上下文切换到不同的状态StateContext stateContext = new StateContext(orderState);stateContext.switchStateOrder();// 如果写多重if判断的话 整个代码流程 耗时比较长 直接Spring中精准定位到策略或者是状态的话 Map get方法的时候底层是数组return "success";}}public class StateContext {private OrderState orderState;public StateContext(OrderState orderState) {this.orderState = orderState;}public void switchStateOrder() {orderState.orderService();}}public interface OrderState {/*** 返回都会不一样** @return*/public Object orderService();}@Slf4j@Componentpublic class AlreadySignedOrderState implements OrderState {@Overridepublic Object orderService() {log.info(">> 切换已经签收状态");return "切换已经签收状态";}}@Slf4j@Componentpublic class InTransitOrderState implements OrderState {@Overridepublic String orderService() {log.info(">>>切换为正在运送状态...");return "success";}}@Slf4j@Componentpublic class ShippedAlreadyOrderState implements OrderState {public String orderService() {log.info(">>>切换为已经发货状态..");return "已经发货..";}}
4、状态模式与策略模式的区别
实质上的实现的方式都是相同的,但是状态模式是根据不同的状态改变 行为,而策略模式是根据不同的状态改变的是同一种行为中的不同策略
