package com.amg.strategy.constants;
import com.amg.strategy.vo.NewStrategyRequestVO;
import com.amg.strategy.vo.NewStrategyResponseVO;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* 枚举策略的实现
* @author Amg
* @date 2021/12/2
*/
public enum SelectStrategyEnum {
/**
* 原价
*/
NORMAL(1,"原价策略") {
@Override
protected double payMoney(double money) {
return money;
}
@Override
protected List<String> getFoods(String... foods) {
return Arrays.asList(foods);
}
},
COUPON(2,"优惠券满减策略") {
@Override
protected double payMoney(double money) {
final Double thresholdPrice = requestVO.getThresholdPrice();
return money > thresholdPrice
? money - requestVO.getReducePrice()
: money;
}
@Override
protected List<String> getFoods(String... foods) {
return Arrays.asList(foods);
}
},
DISCOUNT(3,"折扣策略") {
@Override
protected double payMoney(double money) {
return BigDecimal.valueOf(money * requestVO.getDiscount()).setScale(2, RoundingMode.HALF_DOWN).doubleValue();
}
@Override
protected List<String> getFoods(String... foods) {
return Arrays.asList(foods);
}
},
BUY_ONE_GET_ONE(4,"买一送一策略") {
@Override
protected double payMoney(double money) {
return money;
}
@Override
protected List<String> getFoods(String... foods) {
List<String> list = new ArrayList<>();
StringBuilder sb = new StringBuilder();
for (String food : foods) {
sb.append(food).append("*2").append(";");
}
list.add(sb.toString());
return list;
}
},
FREE(5,"免费送策略") {
@Override
protected double payMoney(double money) {
return 0;
}
@Override
protected List<String> getFoods(String... foods) {
return Arrays.asList(foods);
}
};
/**
* 策略类型
*/
private Integer type;
/**
* 策略名称
*/
private String name;
/**
* 策略请求对象
*/
private static NewStrategyRequestVO requestVO;
private static void setRequestVO(NewStrategyRequestVO requestVO) {
SelectStrategyEnum.requestVO = requestVO;
}
SelectStrategyEnum(Integer type, String name) {
this.type = type;
this.name = name;
}
/**
* 最终要支付多少钱
* @param money 原始金额
* @return 最终要付的金额
*/
protected abstract double payMoney(double money);
/**
* 最终能拿到的食物列表
* @param foods 食物列表
* @return 最终能拿到的食物列表
*/
protected abstract List<String> getFoods(String... foods);
/**
*
* @param requestVO 策略请求对象
* @return NewStrategyResponseVO
*/
public static NewStrategyResponseVO payAndShowFoods(NewStrategyRequestVO requestVO) {
//调用时,将策略请求对象设置进去,以便各个成员使用
setRequestVO(requestVO);
NewStrategyResponseVO responseVO = new NewStrategyResponseVO();
//遍历寻找匹配的策略
for (SelectStrategyEnum eachStrategy : SelectStrategyEnum.values()) {
//匹配上之后,调用对应策略的具体实现
if (eachStrategy.type.equals(requestVO.getType())) {
responseVO.setActualPayMoney(eachStrategy.payMoney(requestVO.getPayMoney()));
responseVO.setActualFoods(eachStrategy.getFoods(requestVO.getFoods()).toString());
break;
}
}
responseVO.setPayMoney(requestVO.getPayMoney());
responseVO.setFoods(Arrays.asList(requestVO.getFoods()).toString());
return responseVO;
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
后端同学在开发过程中,势必会遇到多条件判断的情况,大部分时候都会直接采用if-else的形式去处理,这样的操作会存在不易扩展的问题,那么如何解决这个问题呢? 这里给出策略模式的例子,以汉堡打折为原型设计,存在优惠券、买一送一、打折、免费等场景的时候,该如何精简代码? 对比枚举策略与简单工厂+策略模式的不同使用,抛砖引玉,引发你更多的思考
资源推荐
资源详情
资源评论
收起资源包目录
strategy.zip (94个子文件)
strategy
pom.xml 2KB
src
test
java
com
amg
strategy
StrategyApplicationTests.java 210B
main
resources
application.properties 1B
templates
static
java
com
amg
strategy
StrategyApplication.java 315B
api
TestController.java 869B
factory
Context.java 716B
HandlerFactory.java 2KB
service
DisCountPrice.java 640B
BuyOneGetOne.java 578B
IMcdonals.java 696B
CouponPrice.java 724B
FreePrice.java 581B
NormalPrice.java 433B
constants
SelectStrategyEnum.java 4KB
vo
NewStrategyResponseVO.java 452B
NewStrategyRequestVO.java 886B
strategy.iml 9KB
.idea
jarRepositories.xml 1KB
uiDesigner.xml 9KB
libraries
Maven__net_minidev_accessors_smart_1_2.xml 542B
Maven__net_bytebuddy_byte_buddy_agent_1_10_8.xml 578B
Maven__org_springframework_spring_test_5_2_4_RELEASE.xml 616B
Maven__org_springframework_boot_spring_boot_2_2_5_RELEASE.xml 636B
Maven__org_springframework_spring_web_5_2_4_RELEASE.xml 609B
Maven__org_apache_tomcat_embed_tomcat_embed_websocket_9_0_31.xml 660B
Maven__org_springframework_spring_jcl_5_2_4_RELEASE.xml 609B
Maven__org_junit_jupiter_junit_jupiter_params_5_5_2.xml 615B
Maven__org_junit_platform_junit_platform_engine_1_5_2.xml 626B
Maven__org_springframework_boot_spring_boot_starter_test_2_2_5_RELEASE.xml 727B
Maven__ch_qos_logback_logback_core_1_2_3.xml 547B
Maven__net_bytebuddy_byte_buddy_1_10_8.xml 536B
Maven__org_skyscreamer_jsonassert_1_5_0.xml 537B
Maven__org_springframework_boot_spring_boot_starter_web_2_2_5_RELEASE.xml 720B
Maven__org_apiguardian_apiguardian_api_1_1_0.xml 572B
Maven__org_slf4j_jul_to_slf4j_1_7_30.xml 534B
Maven__org_projectlombok_lombok_1_18_12.xml 531B
Maven__junit_junit_4_12.xml 455B
Maven__jakarta_xml_bind_jakarta_xml_bind_api_2_3_2.xml 611B
Maven__org_assertj_assertj_core_3_13_2.xml 542B
Maven__org_springframework_boot_spring_boot_starter_json_2_2_5_RELEASE.xml 727B
Maven__org_junit_jupiter_junit_jupiter_api_5_5_2.xml 594B
Maven__jakarta_validation_jakarta_validation_api_2_0_2.xml 633B
Maven__org_slf4j_slf4j_api_1_7_30.xml 513B
Maven__org_springframework_spring_beans_5_2_4_RELEASE.xml 623B
Maven__org_springframework_boot_spring_boot_starter_tomcat_2_2_5_RELEASE.xml 741B
Maven__com_fasterxml_classmate_1_5_1.xml 522B
Maven__org_mockito_mockito_junit_jupiter_3_1_0.xml 598B
Maven__org_junit_jupiter_junit_jupiter_5_5_2.xml 566B
Maven__com_fasterxml_jackson_core_jackson_annotations_2_10_2.xml 651B
Maven__jakarta_activation_jakarta_activation_api_1_2_2.xml 633B
Maven__org_springframework_spring_expression_5_2_4_RELEASE.xml 658B
Maven__org_apache_tomcat_embed_tomcat_embed_el_9_0_31.xml 611B
Maven__com_vaadin_external_google_android_json_0_0_20131108_vaadin1.xml 700B
Maven__org_xmlunit_xmlunit_core_2_6_3.xml 535B
Maven__org_springframework_boot_spring_boot_starter_2_2_5_RELEASE.xml 692B
Maven__org_jboss_logging_jboss_logging_3_4_1_Final.xml 608B
Maven__org_ow2_asm_asm_5_0_4.xml 472B
Maven__org_opentest4j_opentest4j_1_2_0.xml 533B
Maven__org_springframework_boot_spring_boot_starter_logging_2_2_5_RELEASE.xml 748B
Maven__ch_qos_logback_logback_classic_1_2_3.xml 568B
Maven__com_fasterxml_jackson_module_jackson_module_parameter_names_2_10_2.xml 736B
Maven__com_fasterxml_jackson_datatype_jackson_datatype_jsr310_2_10_2.xml 695B
Maven__jakarta_annotation_jakarta_annotation_api_1_3_5.xml 633B
Maven__org_hibernate_validator_hibernate_validator_6_0_18_Final.xml 681B
Maven__org_junit_vintage_junit_vintage_engine_5_5_2.xml 615B
Maven__com_fasterxml_jackson_core_jackson_databind_2_10_2.xml 630B
Maven__org_junit_jupiter_junit_jupiter_engine_5_5_2.xml 615B
Maven__org_springframework_boot_spring_boot_test_autoconfigure_2_2_5_RELEASE.xml 769B
Maven__net_minidev_json_smart_2_3.xml 507B
Maven__org_springframework_spring_aop_5_2_4_RELEASE.xml 609B
Maven__org_apache_logging_log4j_log4j_api_2_12_1.xml 573B
Maven__org_springframework_boot_spring_boot_starter_validation_2_2_5_RELEASE.xml 769B
Maven__org_apache_logging_log4j_log4j_to_slf4j_2_12_1.xml 608B
Maven__org_springframework_spring_core_5_2_4_RELEASE.xml 616B
Maven__org_hamcrest_hamcrest_2_1.xml 497B
Maven__org_junit_platform_junit_platform_commons_1_5_2.xml 633B
Maven__com_jayway_jsonpath_json_path_2_4_0.xml 546B
Maven__org_apache_tomcat_embed_tomcat_embed_core_9_0_31.xml 625B
Maven__org_springframework_spring_webmvc_5_2_4_RELEASE.xml 630B
Maven__org_springframework_boot_spring_boot_autoconfigure_2_2_5_RELEASE.xml 734B
Maven__com_fasterxml_jackson_core_jackson_core_2_10_2.xml 602B
Maven__org_yaml_snakeyaml_1_25.xml 495B
Maven__org_springframework_spring_context_5_2_4_RELEASE.xml 637B
Maven__org_mockito_mockito_core_3_1_0.xml 535B
Maven__com_fasterxml_jackson_datatype_jackson_datatype_jdk8_2_10_2.xml 681B
Maven__org_objenesis_objenesis_2_6.xml 508B
Maven__org_springframework_boot_spring_boot_test_2_2_5_RELEASE.xml 671B
workspace.xml 24KB
misc.xml 451B
inspectionProfiles
Project_Default.xml 1KB
compiler.xml 879B
modules.xml 263B
.gitignore 218B
sonarlint
issuestore
encodings.xml 327B
共 94 条
- 1
资源评论
码农Amg
- 粉丝: 8
- 资源: 13
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功