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

    2、状态模式的应用场景

    图片2.png
    对象的行为取决于它的状态;
    操作中含有较多的条件语句(if判断)

    3、具体实现需要
    重构的代码

    1. public class OrderService {
    2. public String orderState(String state) {
    3. if (state.equals("0")) {
    4. return "已经发货";
    5. }
    6. if (state.equals("1")) {
    7. return "正在运送中...";
    8. }
    9. if (state.equals("2")) {
    10. return "正在派送中...";
    11. }
    12. if (state.equals("3")) {
    13. return "已经签收";
    14. }
    15. if (state.equals("4")) {
    16. return "拒绝签收";
    17. }
    18. if (state.equals("5")) {
    19. return "订单交易失败";
    20. }
    21. return "未找到对应的状态";
    22. }
    23. }

    优化后:

    1. @Component
    2. public class SpringUtils implements ApplicationContextAware {
    3. private static ApplicationContext applicationContext;
    4. @Override
    5. public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    6. this.applicationContext = applicationContext;
    7. }
    8. //获取applicationContext
    9. public static ApplicationContext getApplicationContext() {
    10. return applicationContext;
    11. }
    12. //通过name获取 Bean.
    13. public static Object getBean(String name){
    14. return getApplicationContext().getBean(name);
    15. }
    16. //通过class获取Bean.
    17. public static <T> T getBean(Class<T> clazz){
    18. return getApplicationContext().getBean(clazz);
    19. }
    20. //通过name,以及Clazz返回指定的Bean
    21. public static <T> T getBean(String name,Class<T> clazz){
    22. return getApplicationContext().getBean(name, clazz);
    23. }
    24. }
    25. @RestController
    26. public class OrderController {
    27. @RequestMapping("/order")
    28. public String order(String stateBeanId) {
    29. //1.使用Spring上下文获取bean中对象
    30. OrderState orderState = SpringUtils.getBean(stateBeanId, OrderState.class);
    31. // 2.使用上下文切换到不同的状态
    32. StateContext stateContext = new StateContext(orderState);
    33. stateContext.switchStateOrder();
    34. // 如果写多重if判断的话 整个代码流程 耗时比较长 直接Spring中精准定位到策略或者是状态的话 Map get方法的时候底层是数组
    35. return "success";
    36. }
    37. }
    38. public class StateContext {
    39. private OrderState orderState;
    40. public StateContext(OrderState orderState) {
    41. this.orderState = orderState;
    42. }
    43. public void switchStateOrder() {
    44. orderState.orderService();
    45. }
    46. }
    47. public interface OrderState {
    48. /**
    49. * 返回都会不一样
    50. *
    51. * @return
    52. */
    53. public Object orderService();
    54. }
    55. @Slf4j
    56. @Component
    57. public class AlreadySignedOrderState implements OrderState {
    58. @Override
    59. public Object orderService() {
    60. log.info(">> 切换已经签收状态");
    61. return "切换已经签收状态";
    62. }
    63. }
    64. @Slf4j
    65. @Component
    66. public class InTransitOrderState implements OrderState {
    67. @Override
    68. public String orderService() {
    69. log.info(">>>切换为正在运送状态...");
    70. return "success";
    71. }
    72. }
    73. @Slf4j
    74. @Component
    75. public class ShippedAlreadyOrderState implements OrderState {
    76. public String orderService() {
    77. log.info(">>>切换为已经发货状态..");
    78. return "已经发货..";
    79. }
    80. }

    4、状态模式与策略模式的区别
    实质上的实现的方式都是相同的,但是状态模式是根据不同的状态改变 行为,而策略模式是根据不同的状态改变的是同一种行为中的不同策略