java策略模式实践
java策略模式 在具体实践中根据业务形态不同做适当调整
1、被动方式
策略维护规则用 switch case 模式 每新加一个实现类 需根据 type 指定具体实现类
优点:所有实现类都必须在context中显示初始化 所有实现类一目了然 比较清晰
缺点:context中暴露了具体的接口实现 弱化了context的能力
简略代码实现
interface Fruit{
String color;
int size;
}
class Apple implements Fruit{
String color;
int size;
String location;
}
class Pear implements Fruit{
String color;
int size;
String season;
}
class FruitContext{
private Fruit;
private init(int fruitType){
switch(fruitType){
case 苹果:
new Apple();
break;
case 梨子:
new Pear;
break;
...
case 葡萄:
//...;
break;
}
}
// 对应业务逻辑实现
private String processFruit(int fruitType){
init(fruitType);
return Fruit.toString();
}
}
class ProcessFruit{
private FruitContext;
Fruit fruit = FruitContext.init(品类);
String msg = FruitContext.processFruit(品类);
}
2、自动方式
策略只维护超类 相当于只给入口 在应用启动时根据超类获取到超类对应的所有实现类 然后根据实现类的入参 type 与 具体实现累匹配做具体业务层逻辑
优点:不暴露具体实现接口 在应用启动时直接拿到实现类 不冗余
缺点:无
简略代码实现 主要是contex的写法有不同
public interface StrategyDomainService {
String createDetail(StockAuditDO stockAuditDO);
Integer getKey();
}
public class AuditStrategyDomainServiceImpl1 implements StrategyDomainService {
private final static key = key1;
String createDetail(AuditDO auditDO){
//第一个实现类的业务操作
}
Integer getKey(){
return key1;
}
}
public class AuditStrategyDomainServiceImpl2 implements StrategyDomainService {
private final static key = key2;
String createDetail(AuditDO auditDO){
//第二个实现类的业务操作
}
Integer getKey(){
return key2;
}
}
// 策略类
public class AuditContext implements ApplicationContextAware{
private ApplicationContext applicationContext;
Map<Integer, AuditStrategyDomainService> strategyMap = new HashMap<>();
@PostConstruct
public void init(){
Map<String, AuditStrategyDomainService> strategyMapTemp = applicationContext.getBeansOfType(AuditStrategyDomainService.class);
for (String key :strategyMapTemp.keySet()){
AuditStrategyDomainService auditStrategyDomainService = strategyMapTemp.get(key);
strategyMap.put(auditStrategyDomainService.getKey(),auditStrategyDomainService);
}
}
@Async
public void createDetail(StockAuditDO stockAuditDO){
auditStrategyDomainService auditStrategyDomainService = strategyMap.get(auditDO.getAuditType());
auditStrategyDomainService.createDetail(stockAuditDO);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}