欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > 第六章 状态模式优化代码

第六章 状态模式优化代码

2025/2/25 20:24:15 来源:https://blog.csdn.net/qushaming/article/details/144465662  浏览:    关键词:第六章 状态模式优化代码

目录

一、场景概述

二、状态模式优化代码


一、场景概述

我们在日常开发过程中一定会遇到下述场景:业务中有类似订单这样需要修改状态的功能模块,订单状态的修改变化为 未支付 -> 已支付 -> 已完成

因此我们每次在修改状态之前,都得先判断下现有的订单状态值是多少,这样就会的导致代码中产生很多不必要的if set语句,非常的不优雅。

package com.example.enums;import java.util.Arrays;/*** 订单枚举类*/
public enum OrderStateEnum {// 未支付UNPAY(0, "未支付"),// 已支付PAID(1, "已支付"),// 已完成FINISHED(2, "已完成");private Integer code;private String value;OrderStateEnum(Integer code, String value) {this.code = code;this.value = value;}public Integer getCode() {return code;}public String getValue() {return value;}public static OrderStateEnum byCode(Integer code) {return Arrays.stream(values()).filter(t -> t.getCode().equals(code)).findFirst().get();}
}
package com.example.domain.po;import com.example.enums.OrderStateEnum;
import lombok.Data;@Data
public class Order {private Long id;private String orderNo;private Integer state;public Order() {state = OrderStateEnum.UNPAY.getCode();}
}
package com.example;import com.example.domain.po.Order;
import com.example.enums.OrderStateEnum;public class Test {// Order 未支付 -> 已支付 -> 已完成public static void main(String[] args) {Order order = new Order();if (order.getState() == OrderStateEnum.UNPAY.getCode()) {order.setState(OrderStateEnum.PAID.getCode());}}
}

二、状态模式优化代码

package com.example.enums;import com.example.domain.po.Order;
import java.util.Arrays;/*** 订单枚举类*/
public enum OrderStateEnum {// 未支付UNPAY(0, "未支付") {@Overridepublic void nextState(Order order) { order.setState(PAID.code); }},// 已支付PAID(1, "已支付") {@Overridepublic void nextState(Order order) { order.setState(FINISHED.code); }},// 已完成FINISHED(2, "已完成")  {@Overridepublic void nextState(Order order) { order.setState(PAID.code); }};private Integer code;private String value;OrderStateEnum(Integer code, String value) {this.code = code;this.value = value;}public Integer getCode() {return code;}public String getValue() {return value;}public static OrderStateEnum byCode(Integer code) {return Arrays.stream(values()).filter(t -> t.getCode().equals(code)).findFirst().get();}public abstract void nextState(Order order);
}
package com.example.domain.po;import com.example.enums.OrderStateEnum;
import lombok.Data;@Data
public class Order {private Long id;private String orderNo;private Integer state;public Order() {state = OrderStateEnum.UNPAY.getCode();}public void nextState() {OrderStateEnum.byCode(state).nextState(this);}
}
package com.example;import com.example.domain.po.Order;public class Test {// Order 未支付 -> 已支付 -> 已完成public static void main(String[] args) {Order order = new Order();System.out.println(order.getState());order.nextState();System.out.println(order.getState());order.nextState();System.out.println(order.getState());}
}

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词