当我们的代码出现很多if-else的时候,这时候代码看起来是非常不美观的,所以可以使用策略模式将if-else消除。这次讲的主要是基于spring的
1. 定义Operation接口
public interface Operation {
/**
* 接口实现
* @param a
* @param b
* @return
*/
int apply(int a, int b);
/**
* 获得名字
* @return
*/
String getName();
}
该接口有两个方法,apply方法主要是具体实现类的计算方式。getName的获得实现类的名称
2. 定义AddOperation类继承Operation接口
public class AddOperation implements Operation {
private final String name = "add";
@Override
public int apply(int a, int b) {
return a + b;
}
@Override
public String getName() {
return this.name;
}
}
3. 定义SubtractOperation类实现Operation接口
public class SubtractOperation implements Operation {
private final String name = "sub";
@Override
public int apply(int a, int b) {
return a - b;
}
@Override
public String getName() {
return this.name;
}
}
4. 定义CompositeOperation类
public class CompositeOperation {
/**
* 装载Operation对象的map
*/
private Map<String, Operation> map;
public CompositeOperation(List<Operation> list) {
this.map = new HashMap<>(list.size());
list.forEach(operation -> map.put(operation.getName(), operation));
}
public Operation getOperation(String key) {
return map.get(key);
}
}
该类主要是用来装载所有Operation接口的对象,并且提供获得Operation接口的对象的方法
5. 定义OperationConfig类来注入前面三个类
@Configuration
public class OperationConfig {
@Bean
public Operation addOperation() {
return new AddOperation();
}
@Bean
public Operation subtractOperation() {
return new SubtractOperation();
}
@Bean
public CompositeOperation compositeOperation(List<Operation> list) {
return new CompositeOperation(list);
}
}
这样我们通过注入CompositeOperation类的对象,然后通过getOperation方法传入Operation实现类定义的名字,就能计算出不同的结果
@Autowired
private CompositeOperation operation;
operation.getOperation("add").apply(2, 1) 结果为3
operation.getOperation("sub").apply(2, 1) 结果为1