策略模式
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。
何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。
如何解决:将这些算法封装成一个一个的类,任意地替换。
关键代码:实现同一个接口。
1.定义一个接口
public interface StrategyPatternInter {
String strategyPatternDemo(String msg);
}
2.实现上面这个接口
@Component
public class StrategyPatternDemoImp1 implements StrategyPatternInter{
@Override
public String strategyPatternDemo(String msg) {
System.out.println("this is demo1 :" +msg);
return null;
}
}
@Component
public class StrategyPatternDemoImp2 implements StrategyPatternInter{
@Override
public String strategyPatternDemo(String msg) {
System.out.println("this is demo2 : "+ msg);
return null;
}
}
3.创建上下文管理,用于提取策略,把实现类注入到Map类中
@Component
public class StrategyPattern {
@Autowired
private Map<String, StrategyPatternInter> strategyMap;
public StrategyPatternInter stragegy(String model) {
return this.strategyMap.get(model);
}
}
4.控制层
@RestController
public class StrategyPatternContro {
@Autowired
StrategyPattern strategyPattern;
@RequestMapping("/sp")
public void send(String model,String msg) {
strategyPattern.send(model).strategyPatternDemo(msg);
}
}
5.仅仅这样有可能 无法满足实际 业务需要那么就进行 别名转换
5.1.用 枚举模式
略。。。
5.2.文件配置
5.2.1定义一个类 用于别名 ,从配置文件中读取
@Component
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "ent")
public class Type {
private HashMap<String, String> map;
public HashMap<String, String> getMap() {
return map;
}
public void setMap(HashMap<String, String > map) {
this.map = map;
}
}
5.2.2配置文件配置 (这里是 .yml文件)
ent:
map:
A: strategyPatternDemoImp1
B: strategyPatternDemoImp2
5.2.3 修改上下文管理管理类
@Component
public class StrategyPattern {
@Autowired
private Type type;
@Autowired
private final Map<String, StrategyPatternInter> strategyMap;
public StrategyPatternInter stragegy(String model) {
return this.strategyMap.get(type.getMap().get(mode));
}
}