策略工厂(Spring)

策略工厂

刚刚又重新温顾一遍设计模式的内容,刚好工作中又有可以用到设计模式的地方。就结合Spring写一个策略工厂
背景:多种采集信息需要进行不同的处理后返回
下面鼠鼠贴一些伪代码:

工厂类:

/**
 * 采集信息策略工厂
 */
@Component
public class CollectionParserStrategyFactory {

    private final static Map<String, CollectionStrategy> strategies = new HashMap<>(16);

    /**
     * 把策略注入到Spring容器中
     * @param bloodPressureStrategy
     * @param bloodSugarStrategy
     * @param stepNumberStrategy
     * @param sleepStrategy
     * @param bodyTemperatureStrategy
     * @param heartRateStrategy
     * @param bloodOxygenStrategy
     * @param metabolizeStrategy
     */
    @Autowired
    public CollectionParserStrategyFactory(
            BloodPressureStrategy bloodPressureStrategy,
            BloodSugarStrategy bloodSugarStrategy,
            StepNumberStrategy stepNumberStrategy,
            SleepStrategy sleepStrategy,
            BodyTemperatureStrategy bodyTemperatureStrategy,
            HeartRateStrategy heartRateStrategy,
            BloodOxygenStrategy bloodOxygenStrategy,
            MetabolizeStrategy metabolizeStrategy
    ) {
        strategies.put("1", bloodPressureStrategy);
        strategies.put("2", bloodSugarStrategy);
        strategies.put("12", stepNumberStrategy);
        strategies.put("13", stepNumberStrategy);
        strategies.put("5", sleepStrategy);
        strategies.put("9", bodyTemperatureStrategy);
        strategies.put("11", heartRateStrategy);
        strategies.put("14", bloodOxygenStrategy);
        strategies.put("15", metabolizeStrategy);
    }

    public static CollectionStrategy getStrategy(String collectionCode) throws BusinessException {
        CollectionStrategy strategy = strategies.get(collectionCode);
        if (strategy == null) {
            throw new BusinessException("未知的采集项目代码: " + collectionCode);
        }
        return strategy;
    }
}

抽象策略接口:

/**
 * 策略抽象接口
 */
public interface  CollectionStrategy {

     List<RecentlyDataOutVo> parseCollection(Integer collectionDayCount, String userId,String mark,String collectionCode);

    /**
     * 静态近期日期转化格式方法
     * @param outVoList
     * @return
     */
    static List<RecentlyDataOutVo> parseTime(List<RecentlyDataOutVo> outVoList){
        for (RecentlyDataOutVo recentlyDataOutVo:outVoList){
            String collectionDay = recentlyDataOutVo.getCollectionDate();
            String format = DateUtil.format(DateUtil.parse(collectionDay), "MM.dd");
            recentlyDataOutVo.setCollectionDate(format);
        }
        return outVoList;
    }


}

策略实现类:

/**
 * 睡眠策略
 */
@Component
public class SleepStrategy implements CollectionStrategy{
    @Autowired
    MyDailyCollectionMapper myDailyCollectionMapper;



    @Override
    public List<RecentlyDataOutVo> parseCollection(Integer collectionDayCount, String userId,String mark,String collectionCode) {

        List<RecentlyDataOutVo> sleepData = myDailyCollectionMapper.getSleepData(collectionDayCount, userId, mark, collectionCode);
        long duration=0;
        DecimalFormat decimalFormat = new DecimalFormat("#.00");

        for (RecentlyDataOutVo outVo:sleepData){
                Double time = new Long(duration).doubleValue()/60/60;
                String formattedTime = decimalFormat.format(time);
                Double hour = Double.parseDouble(formattedTime);
                outVo.setCollectionOne(hour);
        }

        return CollectionStrategy.parseTime(sleepData);

    }
}

血糖策略:

/**
 * 血糖策略
 */
@Component
public class BloodSugarStrategy implements CollectionStrategy{
    @Autowired
    MyDailyCollectionMapper myDailyCollectionMapper;
    @Override
    public List<RecentlyDataOutVo> parseCollection(Integer collectionDayCount, String userId,String mark,String collectionCode) {
        List<RecentlyDataOutVo> avgData = myDailyCollectionMapper.getSugarData(collectionDayCount, userId, mark, collectionCode);
        return CollectionStrategy.parseTime(avgData);
    }
}

就不一一列举了

随后在业务类中使用

	//在工厂中获取对应的策略产品
		CollectionStrategy strategy = CollectionParserStrategyFactory.getStrategy(inVo.getCollectionCode());

		//调用产品自己的方法
		List<RecentlyDataOutVo> recentlyDataOutVos = strategy.parseCollection(inVo.getCollectionDayCount(), sessionBean.getUserId(), Constants.MARK_NORMAL,inVo.getCollectionCode());

学设计模式后感觉下来就是玩的Java面向对象的基础,封装、继承、多态,这三个基本特征在 接口,抽象类与继承实现类之前巧妙的运动

**温顾一下面向对象的三大基本特征

1. 封装:封装就是把现实世界中的客观事务抽象成一个Java类,然后再类中存放属性和方法。如封装一个汽车类,其中包含了发动机、轮胎、底盘等属性,并且有启动、前进等方法。
2. 继承:像现实世界中儿子可以继承父亲的财产、样貌、行为等一样,编程世界中也有继承,继承的主要目的就是为了实现复用。子类可以继承父类,这样就可以把父类的属性和方法继承过来。如Dog类可以继承Animal类,继承过来嘴巴、颜色等属性,吃东西、奔跑等行为。
3. 多态:多态是指父类中定义的属性和方法被子类继承后,可以通过重写,使得父类和子类有不同的实现,这使得同一个属性活方法在父类以及器子类中具有不同的含义。
如Animaldog=new Dog();
**

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值