springboot的策略模式的变体(中策略模式的巧妙用法)
策略模式,主要用于解决根据不同的环境或者条件选择不同的算法或者策略来完成某个功能具体什么是策略模式可百度了解,下面我们就来说一说关于springboot的策略模式的变体?我们一起去了解并探讨一下这个问题吧!
springboot的策略模式的变体
- 什么是策略模式
策略模式,主要用于解决根据不同的环境或者条件选择不同的算法或者策略来完成某个功能。具体什么是策略模式可百度了解。
2.应用场景
某个商城根据会员的不同等级,对会员采取不同的优惠折扣。
在这个场景中,变化的条件是会员的等级,需要实现的策略是会员等级对应的不同优惠折扣算法。
(1)首先我们先创建一个优惠折扣策略的接口,里面有两个方法,一个是定义会员等级,一个定义会员等级的折扣方法。
package com.example.li.strategy;
/**
* @ClassName DiscountStrategy.java
* @Description: 折扣的优化策略接口,不同的折扣算法实现这个接口
* @createTime 2022年01月04日 22:30:00
*/
public interface DiscountStrategy {
/**
* 会员的等级
*/
int getLevel();
/**
* 根据不同的会员等级选者不同的折扣
* @param level 会员等级
* @return 折扣数
*/
int discount(int level);
}
(2) 创建一个抽象基类,用于实现这个策略接口,同时实现bean 的初始化接口,重写afterPropertiesSet() 方法。此方法中调用 DiscountFactory.register(getLevel(),this); 将会员等级以及其对应的策略实现类注册到 map 中。
package com.example.li.strategy;
import org.springframework.beans.factory.InitializingBean;
/**
* @ClassName BaseDiscountStrategy.java
* @Description:
* @createTime 2022年01月04日 22:40:00
*/
public abstract class BaseDiscountStrategy implements DiscountStrategy, InitializingBean {
@Override
public void afterPropertiesSet() throws Exception {
DiscountFactory.register(getLevel(),this);
}
}
(3)创建一个注册工厂类,里面定义一个注册方法,用于将折扣实现的策略和会员等级注册进map中保存,同时提供一个通过会员等级获取折扣策略实现类的方法。
package com.example.li.strategy;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* @ClassName DiscountService.java
* @Description:
* @createTime 2022年01月04日 22:43:00
*/
public class DiscountFactory {
private static final Map<Integer,DiscountStrategy> map = new ConcurrentHashMap<>();
public static void register(Integer level,DiscountStrategy strategy){
map.put(level,strategy);
}
public static DiscountStrategy getDiscountStrategy(int level){
return map.get(level);
}
}
(4)实现两个具体的策略算法,实现接口的方法
package com.example.li.strategy;
import org.springframework.stereotype.Component;
/**
* @ClassName HighLevel.java
* @Description: 高级会员折扣
* @createTime 2022年01月04日 22:34:00
*/
@Component
public class HighLevel extends BaseDiscountStrategy{
@Override
public int getLevel() {
return 5;
}
@Override
public int discount(int level) {
return 3;
}
}
package com.example.li.strategy;
import org.springframework.stereotype.Component;
/**
* @ClassName LowLevel.java
* @Description: 低级会员折扣
* @createTime 2022年01月04日 22:35:00
*/
@Component
public class LowLevel extends BaseDiscountStrategy{
@Override
public int getLevel() {
return 2;
}
@Override
public int discount(int level) {
return 6;
}
}
(5)在业务中调用
package com.example.li.strategy;
import org.springframework.stereotype.Component;
/**
* @ClassName DiscountService.java
* @Description:
* @createTime 2022年01月04日 22:49:00
*/
@Component
public class DiscountService {
public int getDiscount(){
int level = 3;
DiscountStrategy discountStrategy = DiscountFactory.getDiscountStrategy(level);
return discountStrategy.discount(level);
}
}
免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com