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 */@Componentpublic 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 */@Componentpublic 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 */@Componentpublic class DiscountService { public int getDiscount(){ int level = 3; DiscountStrategy discountStrategy = DiscountFactory.getDiscountStrategy(level); return discountStrategy.discount(level); }}