Strategy模式的应用场景是:
1. 多个类的分别只是在于行为不同
2. 你需要对行为的算法做很多变动
3. 客户不知道算法要使用的数据
Strategy模式接口里声明的方法一般是公有的。
下面是示例代码:
/**
* 分表策略
*/
public abstract class SubTableStrategy
{
//动态表类型,表类型与精度相关,如果需要自定义精度,可以设置为自定义类型
public static final int TYPE_CURRENT = 20;
public static final int TYPE_MINUTE = 60;
public static final int TYPE_5_MINUTE = 300;
public static final int TYPE_HOUR = 3600;
public static final int TYPE_DAY = 24*3600;
public static final int TYPE_CUSTOM = -1;
/**
* 当前表策略
*/
public static final CurrentStrategy current = new CurrentStrategy();
/**
* 分钟表
*/
public static final MinuteStrategy minute = new MinuteStrategy();
/**
* 5分钟表
*/
public static final FiveMinuteStrategy minute_5 = new FiveMinuteStrategy();
/**
* 小时表
*/
public static final HourStrategy hour = new HourStrategy();
/**
* 天表
*/
public static final DayStrategy day = new DayStrategy();
/**
* 获取表后缀名称
* @return
*/
public abstract String getSubTableSuffix(long time);
/**
* 获取下一张表后缀名称
* @return
*/
public abstract String getNextSubTableSuffix(long time);
/**
* 获取调度配置
* @return
*/
public abstract String getCornConf();
/**
* 获取分表类型,当前表,分钟表,小时表,天表,自定义表等
* @return
*/
public abstract int getSubTableType();
/**
* 精度,单位s
* @return
*/
public abstract int getSecondsAccuracy();
/**
* 获取表中存储数据的时间限制
* 即当前表存储数据的时间宽度,单位s
* @return
*/
public abstract int getStorageLimitSeconds();
/**
* 获取在线保存时间,单位s
*/
public abstract int getDataOnLineSeconds();
/**
* 获取归档时间
* @return
*/
public abstract int getPlaceOnFileSeconds();
}
策略实现类代码:
/**
* 当前表策略
*/
public class CurrentStrategy extends SubTableStrategy
{
private static final SimpleDateFormat dateFmt = new SimpleDateFormat("yyyyMMdd_HH_mm");
@Override
public String getSubTableSuffix(long time)
{
return "_current_"+dateFmt.format(new Date(time-(time%(getStorageLimitSeconds()*1000))));
}
/**
* 获取下一张表后缀名称
* @return
*/
public String getNextSubTableSuffix(long time)
{
return "_current_"+dateFmt.format(new Date(time-(time%(getStorageLimitSeconds()*1000))+getStorageLimitSeconds()*1000));
}
/**
* 获取调度配置
* @return
*/
public String getCornConf()
{
return null;
}
@Override
public int getSubTableType()
{
return SubTableStrategy.TYPE_CURRENT;
}
@Override
public int getSecondsAccuracy()
{
return ApmFlowEngine.analyseCycle;
}
/**
* 仅存储5分钟的数据
*/
@Override
public int getStorageLimitSeconds()
{
return 5*60;
}
/**
* 数据在线时间为1小时
*/
@Override
public int getDataOnLineSeconds()
{
return 60*60;
}
/**
* 数据归档时间为3天
*/
@Override
public int getPlaceOnFileSeconds()
{
return 3*24*60*60;
}
}
/**
* 分钟表策略
*/
public class MinuteStrategy extends SubTableStrategy
{
private static final SimpleDateFormat dateFmt = new SimpleDateFormat("yyyyMMdd_HH");
@Override
public String getSubTableSuffix(long time)
{
return "_minute_"+dateFmt.format(new Date(time-(time%(getStorageLimitSeconds()*1000))));
}
/**
* 获取下一张表后缀名称
* @return
*/
public String getNextSubTableSuffix(long time)
{
return "_minute_"+dateFmt.format(new Date(time-(time%(getStorageLimitSeconds()*1000))+getStorageLimitSeconds()*1000));
}
/**
* 获取调度配置
* @return
*/
public String getCornConf()
{
return "0 0/1 * * * ?";
}
@Override
public int getSubTableType()
{
return SubTableStrategy.TYPE_MINUTE;
}
@Override
public int getSecondsAccuracy()
{
return 60;
}
/**
* 仅存储1小时的数据
*/
@Override
public int getStorageLimitSeconds()
{
return 60*60;
}
/**
* 数据在线时间为31天
*/
@Override
public int getDataOnLineSeconds()
{
return 31*24*60*60;
}
/**
* 数据归档时间为3个月
*/
@Override
public int getPlaceOnFileSeconds()
{
return 3*31*24*60*60;
}
}
剩余的代码就不贴出来了,您可以自己写实现,主要是接口的方法是public,方便在不同的场景下使用不同的分表策略。