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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值