设计模式之策略模式
1 编写接口
package strategy.impl;
import enums.ComputeTypeEnum;
public interface ComputeStrategy{
Integer execute(Integer a,Integer b);
ComputeTypeEnum applyFor();
}
2 枚举类
package enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Objects;
@Getter
@AllArgsConstructor
public enum ComputeTypeEnum {
ADD(1, "加法"),
SUB(2, "减法"),
MULTIPLY(3, "乘法"),
DIV(4, "除法");
private final Integer code;
private final String desc;
public static ComputeTypeEnum getCode(Integer code) {
for (ComputeTypeEnum item : values()) {
if (Objects.equals(item.getCode(), code)) {
return item;
}
}
return null;
}
}
3编写策略
package strategy.impl;
import enums.ComputeTypeEnum;
public class AddStrategy implements ComputeStrategy{
@Override
Integer execute(Integer a,Integer b){
return a+b;
}
@Override
ComputeTypeEnum applyFor(){
return ComputeTypeEnum.ADD;
}
}
public class SubStrategy implements ComputeStrategy {
@Override
public Integer execute(Integer a, Integer b) {
return a - b;
}
@Override
public ComputeTypeEnum applyFor() {
return ComputeTypeEnum.SUB;
}
}
4 使用策略
import org.springframework.context.ApplicationContextAware;
import com.google.common.collect.Maps;
public Class IntegerCompute implements ApplicationContextAware{
private Map<ComputeTypeEnum,ComputeStrategy> strategyMap = Maps.newHashMap();
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException{
Map<String,ComputeStrategy> map = applicationContext.getBeansOfType(ComputeStrategy.class);
for(ComputeStrategy strategy : map.values()){
strategyMap.put(strategy.applyFor(),strategy);
}
}
public Integer compute(Integer a,Integer b,ComputeTypeEnum type){
ComputeStrategy strategy= strategyMap.get(type);
rerurn strategy.compute(a,b);
}
}