策略模式----分表策略

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,方便在不同的场景下使用不同的分表策略。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lincy521

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值