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;
    }
}