第六章 状态模式优化代码

打印 上一主题 下一主题

主题 750|帖子 750|积分 2250

目录

一、场景概述
二、状态模式优化代码


一、场景概述

我们在日常开发过程中肯定会遇到下述场景:业务中有类似订单这样需要修改状态的功能模块,订单状态的修改变革为 未付出 -> 已付出 -> 已完成
因此我们每次在修改状态之前,都得先判断下现有的订单状态值是多少,这样就会的导致代码中产生许多不必要的if set语句,非常的不优雅。
  1. package com.example.enums;
  2. import java.util.Arrays;
  3. /**
  4. * 订单枚举类
  5. */
  6. public enum OrderStateEnum {
  7.     // 未支付
  8.     UNPAY(0, "未支付"),
  9.     // 已支付
  10.     PAID(1, "已支付"),
  11.     // 已完成
  12.     FINISHED(2, "已完成");
  13.     private Integer code;
  14.     private String value;
  15.     OrderStateEnum(Integer code, String value) {
  16.         this.code = code;
  17.         this.value = value;
  18.     }
  19.     public Integer getCode() {
  20.         return code;
  21.     }
  22.     public String getValue() {
  23.         return value;
  24.     }
  25.     public static OrderStateEnum byCode(Integer code) {
  26.         return Arrays.stream(values()).filter(t -> t.getCode().equals(code)).findFirst().get();
  27.     }
  28. }
复制代码
  1. package com.example.domain.po;
  2. import com.example.enums.OrderStateEnum;
  3. import lombok.Data;
  4. @Data
  5. public class Order {
  6.     private Long id;
  7.     private String orderNo;
  8.     private Integer state;
  9.     public Order() {
  10.         state = OrderStateEnum.UNPAY.getCode();
  11.     }
  12. }
复制代码
  1. package com.example;
  2. import com.example.domain.po.Order;
  3. import com.example.enums.OrderStateEnum;
  4. public class Test {
  5.     // Order 未支付 -> 已支付 -> 已完成
  6.     public static void main(String[] args) {
  7.         Order order = new Order();
  8.         if (order.getState() == OrderStateEnum.UNPAY.getCode()) {
  9.             order.setState(OrderStateEnum.PAID.getCode());
  10.         }
  11.     }
  12. }
复制代码
二、状态模式优化代码

  1. package com.example.enums;
  2. import com.example.domain.po.Order;
  3. import java.util.Arrays;
  4. /**
  5. * 订单枚举类
  6. */
  7. public enum OrderStateEnum {
  8.     // 未支付
  9.     UNPAY(0, "未支付") {
  10.         @Override
  11.         public void nextState(Order order) { order.setState(PAID.code); }
  12.     },
  13.     // 已支付
  14.     PAID(1, "已支付") {
  15.         @Override
  16.         public void nextState(Order order) { order.setState(FINISHED.code); }
  17.     },
  18.     // 已完成
  19.     FINISHED(2, "已完成")  {
  20.         @Override
  21.         public void nextState(Order order) { order.setState(PAID.code); }
  22.     };
  23.     private Integer code;
  24.     private String value;
  25.     OrderStateEnum(Integer code, String value) {
  26.         this.code = code;
  27.         this.value = value;
  28.     }
  29.     public Integer getCode() {
  30.         return code;
  31.     }
  32.     public String getValue() {
  33.         return value;
  34.     }
  35.     public static OrderStateEnum byCode(Integer code) {
  36.         return Arrays.stream(values()).filter(t -> t.getCode().equals(code)).findFirst().get();
  37.     }
  38.     public abstract void nextState(Order order);
  39. }
复制代码
  1. package com.example.domain.po;
  2. import com.example.enums.OrderStateEnum;
  3. import lombok.Data;
  4. @Data
  5. public class Order {
  6.     private Long id;
  7.     private String orderNo;
  8.     private Integer state;
  9.     public Order() {
  10.         state = OrderStateEnum.UNPAY.getCode();
  11.     }
  12.     public void nextState() {
  13.         OrderStateEnum.byCode(state).nextState(this);
  14.     }
  15. }
复制代码
  1. package com.example;
  2. import com.example.domain.po.Order;
  3. public class Test {
  4.     // Order 未支付 -> 已支付 -> 已完成
  5.     public static void main(String[] args) {
  6.         Order order = new Order();
  7.         System.out.println(order.getState());
  8.         order.nextState();
  9.         System.out.println(order.getState());
  10.         order.nextState();
  11.         System.out.println(order.getState());
  12.     }
  13. }
复制代码

通过上述的优化后,我们在业务代码中的状态值修改就变得非常简便,,直接调用nextState就可以修改订单的状态。不过我们需要知道的是,这种优化的条件是状态变革的有序性。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

何小豆儿在此

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表