策略工厂
刚刚又重新温顾一遍设计模式的内容,刚好工作中又有可以用到设计模式的地方。就结合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();**