1.简介
1.1策略模式是一种行为型模式,它将对象和行为分开,将行为定义为 一个行为接口 和 具体行为的实现。策略模式最大的特点是行为的变化,行为之间可以相互替换。每个if判断都可以理解为就是一个策略。本模式使得算法可独立于使用它的用户而变化
1.2主要解决:在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护
2.策略模式简单应用
接口类
public interface MemberStrategy {
/**
* 计算价格的抽象方法
* @param price
* @param n
* @return
*/
Double calcPrice(Double price, Integer n);
}
八折会员
@Service
public class AdvanceMemberStrategy implements MemberStrategy {
@Override
public Double calcPrice(Double price, Integer n) {
return price * n * 0.8;
}
}
九折会员
@Service
public class IntermediateMemberStrategy implements MemberStrategy {
@Override
public Double calcPrice(Double price, Integer n) {
return price * n * 0.9;
}
}
普通会员
@Service
public class PrimaryMemberStrategy implements MemberStrategy {
@Override
public Double calcPrice(Double price, Integer n) {
return n * price * 1;
}
}
枚举
@Getter
public enum MemberEnum {
ADVANCE("2", "advanceMemberStrategy", "ADVANCE"),
INTERMEDIATE("1", "intermediateMemberStrategy", "INTERMEDIATE"),
PRIMARY("0", "primaryMemberStrategy", "PRIMARY");
private String type;
private String implement;
private String desc;
MemberEnum(String type, String implement, String desc){
this.type = type;
this.implement = implement;
this.desc = desc;
}
public static MemberEnum getType(String type){
for(MemberEnum memberEnum: MemberEnum.values()){
if(memberEnum.getType().equals(type)){
return memberEnum;
}
}
return MemberEnum.PRIMARY;
}
}
工厂
@Component
public class StrategyFactory {
@Autowired
private AdvanceMemberStrategy advanceMemberStrategy;
@Autowired
private IntermediateMemberStrategy intermediateMemberStrategy;
@Autowired
private PrimaryMemberStrategy primaryMemberStrategy;
private static volatile Map<MemberEnum, MemberStrategy> map;
@Resource
private Map<String, MemberStrategy> map1;
//手动注册
public MemberStrategy getStrategy(MemberEnum memberEnum){
if(ObjectUtils.isEmpty(map)){
synchronized (Map.class){
if(ObjectUtils.isEmpty(map)){
map = new HashMap<MemberEnum, MemberStrategy>();
map.put(MemberEnum.PRIMARY, primaryMemberStrategy);
map.put(MemberEnum.INTERMEDIATE, intermediateMemberStrategy);
map.put(MemberEnum.ADVANCE, advanceMemberStrategy);
};
}
}
return map.get(memberEnum);
}
//自动注册
public MemberStrategy getStrategy1(MemberEnum memberEnum){
return map1.get(memberEnum.getImplement());
}
}