多种异构数据的分析设计方案:聊聊策略模式+函数式接口
定义
策略模式(Strategy Pattern): 定义并封装一系列算法类,并且这些类可以相互替换,可以在运行时根据需要选择不同的算法,而不需要修改客户端流程代码。
策略模式让算法独立于使用它的客户端而变化,也称为政策模式(Policy)。
主要解决,在有多种算法流程相似的情况下,使用许多if...else分支所带来的代码复杂且难以维护的问题。
关键代码:定义共通的函数时接口。
何时使用:一个系统有许多业务分支类,执行的业务逻辑一致,只是具体实现不同。
如何解决:将这些算法封装成一个一个的类,根据需求任意地组合替换。
业务场景:自动化工厂,按照不同维度度统计分析电量消耗,例如:1.楼栋楼层,2.设备类型,3.产品类型, 4.小时日月年等。
伪代码示例:
(每小时)
@FunctionalInterface
public interface HourFun<T,R> {
/**
* @explain analysis:Bean
* @param T:待分析的参数bean
* @return R:分析完毕得到的数据bean
*/
R exeHour(T hourBean);
}
(每天)
@FunctionalInterface
public interface DayFun<T,R> {
/**
* @explain analysis:Bean
* @param T:待分析的参数bean
* @return R:分析完毕得到的数据bean
*/
R exeDay(T dayBean);
}
(每月)
@FunctionalInterface
public interface MonthFun<T,R> {
/**
* @explain analysis:Bean
* @param T:待分析的参数bean
* @return R:分析完毕得到的数据bean
*/
R exeMonth(T monthBean);
}
(每年)
@FunctionalInterface
public interface YearFun<T,R> {
/**
* @explain analysis:Bean
* @param T:待分析的参数bean
* @return R:分析完毕得到的数据bean
*/
R exeYear(T yearBean);
}
(业务流程逻辑:执行分析的框架方法) 此方法是策略模式中比较核心的点。
public void analysis(ParamBean param, HourFun hourFun,DayFun dayFun, MonthFun monthFun,YearFun yearFun){
..............................
......其他业务逻辑代码 ......
..............................
MAKE_HOUR: {
......其他业务逻辑代码 ......
hourFun.exeHour(param);
}
MAKE_DAY: {
dayFun.exeDay(param);
}
MAKE_MONTH: {
......其他业务逻辑代码 ......
monthFun.exeMonth(param);
}
MAKE_YEAR: {
......其他业务逻辑代码 ......
yearFun.exeYear(param);
}
..............................
......其他业务逻辑代码 ......
..............................
}
定义好各种单一统计方案之后,其实我们就要组装策略了。
加载到执行分析的框架方法中。
以下的每个Service,为符合函数式接口的具体实现类。
具体执行(1.楼栋楼层,)
analysis( param, hour1Service, day1Service, month1Service, year1Service);
具体执行(2.设备分类)
analysis( param, hour2Service, day2Service, month2Service, year2Service);
具体执行(3.产品分类)
analysis( param, hour3Service, day3Service, month3Service, year3Service);