设计模式:策略模式
创始人
2024-04-04 02:04:36
0

策略(Strategy)模式:分离算法,选择实现
比如对象的某个行为,在不同场景有不同实现方式,可以将这些行为的具体实现定义为一组策略,每个实现类实现一种策略,在不同场景使用不同的实现,并且可以自由切换策略,但太多的策略会导致大量代码

  • 优点:
    • 不用太多if else
    • 代码优雅、简单
    • 符合开闭原则,扩展性好、便于维护
  • 优点:
    • 策略如果很多的话,会造成策略类膨胀
    • 使用者必须清楚所有的策略类及其用途

如:电商活动打折,普通会员9折,黄金会员8折,钻石会员7折
1.定义一个Strategy接口,只有打折方法
2.增加3个打折类,对应9折、8折、7折
3.客户端根据会员类型,获取具体的策略算法实现类,再执行打折方法
在这里插入图片描述
策略模式与Spring结合

/*** 打折策略枚举*/
public enum ActivityStrategyEnum {MEMBER(1, "普通会员"),GOLD_MEMBER(2, "黄金会员"),DIAMOND_MEMBER(3, "钻石会员"),;private int code;private String name;ActivityStrategyEnum (int code, String name) {this.code = code;this.name = name;}/*** 通过code匹配对应枚举* @param code* @return*/public static ActivityStrategyEnum match(int code){ActivityStrategyEnum strategyEnum = null;for (ActivityStrategyEnum item : values()){if(item.getCode() == code){strategyEnum = item;break;}}return strategyEnum;}public int getCode() {return code;}public String getName() {return name;}
}
//打折接口
public interface IActivityStrategyService {//策略code    int getCode();/*** 打折* @param money* @return 应付金额*/BigDecimal calculate(BigDecimal money);
}@Service("memberService ")
public class MemberService implements IActivityStrategyService {@Overridepublic int getCode() {return ActivityStrategyEnum.MEMBER.getCode();}@Overridepublic BigDecimal calculate(BigDecimal money) {//普通会员9折return money.multiply(new BigDecimal(0.9)).setScale(2, RoundingMode.HALF_UP);}
}@Service("goldMemberService")
public class GoldMemberService implements IActivityStrategyService {@Overridepublic int getCode() {return ActivityStrategyEnum.GOLD_MEMBER.getCode();}@Overridepublic BigDecimal calculate(BigDecimal money) {//黄金会员8折return money.multiply(new BigDecimal(0.8)).setScale(2, RoundingMode.HALF_UP);}
}@Service("diamondMemberService")
public class DiamondMemberService implements IActivityStrategyService {@Overridepublic int getCode() {return ActivityStrategyEnum.DIAMOND_MEMBER.getCode();}@Overridepublic BigDecimal calculate(BigDecimal money) {//钻石会员7折return money.multiply(new BigDecimal(0.7)).setScale(2, RoundingMode.HALF_UP);}
}
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;@Component
public class ActivityStrategyHandler implements InitializingBean, ApplicationContextAware {/*** 存放策略的map,可以理解为策略的注册中心*/private final Map serviceHashMap = new ConcurrentHashMap<>();/*** spring的上下文*/private ApplicationContext applicationContext;/*** 将StrategyService的类都按照定义好的规则(枚举code),放入strategyServiceMap中** @throws Exception*/@Overridepublic void afterPropertiesSet() throws Exception {Map matchBeans = applicationContext.getBeansOfType(IActivityStrategyService.class);for (IActivityStrategyService strategyService : matchBeans.values()) {serviceHashMap.put(strategyService.getCode(), strategyService);System.out.println("初始化策略模式的键值对 code =" + strategyService.getCode() + " ,value=" + strategyService);}}/*** 注入applicationContext** @param applicationContext* @throws BeansException*/@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;}/*** 通过枚举code获取对应对更新服务* @param strategyEnum* @return*/public IActivityStrategyService getActivityService(ActivityStrategyEnum strategyEnum){return serviceHashMap.get(strategyEnum.getCode());}
}

客户端调用

@RestController
public class IndexController {@Autowiredprivate ActivityStrategyHandler activityHandler;@GetMapping("/acitivity")public BigDecimal acitivity(int code) throws JsonProcessingException {//会员类型codeActivityStrategyEnum strategyEnum = ActivityStrategyEnum.match(code);IActivityStrategyService activityService = activityHandler.getActivityService(strategyEnum);//获取商品金额BigDecimal amount = new BigDecimal(100);//调用具体的打折策略算法BigDecimal price = activityService.calculate(amount);return price ;}
}

相关内容

热门资讯

银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...