基于枚举方式实现策略模式
package com.dashu.park.fire.domain.inspect.enums;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import java.time.*;
import java.time.temporal.TemporalAdjusters;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public enum InspectPeriod {
/**
*
*/
YEAR(2, "每年"){
@Override
public Boolean checkPeriod(Date date) {
String format = DateUtil.format(date, DatePattern.NORM_DATE_PATTERN);
String months = LocalDate.now().minusDays(1L).format(DatePattern.NORM_MONTH_FORMATTER);
return StrUtil.equalsIgnoreCase(format,months);
}
@Override
public List<String> getPeriod(LocalDate date) {
//获取当前时间
LocalDate nowDate = LocalDate.now();
LocalDate firstDayOfYear = nowDate.with(TemporalAdjusters.firstDayOfYear());
LocalDate lastDayOfYear = nowDate.with(TemporalAdjusters.lastDayOfYear());
// //设置零点
// LocalDateTime startDateTime = LocalDateTime.of(date, LocalTime.MIN);
// //设置当天的结束时间
// LocalDateTime endDateTime = LocalDateTime.of(date, LocalTime.MAX);
//获取今年第一天
LocalDateTime startDateTime = LocalDateTime.of(firstDayOfYear, LocalTime.MIN);
//获取今年最后一天
LocalDateTime endDateTime = LocalDateTime.of(lastDayOfYear, LocalTime.MAX);
String startTime = startDateTime.format(DatePattern.NORM_DATETIME_FORMATTER);
String endTime = endDateTime.format(DatePattern.NORM_DATETIME_FORMATTER);
return CollUtil.newArrayList(startTime, endTime);
}
},
WEEK(0, "每周"){
@Override
public Boolean checkPeriod(Date date) {
String format = DateUtil.format(date, DatePattern.NORM_DATE_PATTERN);
String months = LocalDate.now().minusWeeks(1L).format(DatePattern.NORM_MONTH_FORMATTER);
return StrUtil.equalsIgnoreCase(format,months);
}
@Override
public List<String> getPeriod(LocalDate date) {
LocalDate now = LocalDate.now();
DayOfWeek week = now.getDayOfWeek();
int value = week.getValue();
LocalDate start = now.minusDays(value - 1);
LocalDateTime startDateTime = LocalDateTime.parse(start.toString() + "T00:00:00");
LocalDate end = now.plusDays(7 - value);
LocalDateTime endDateTime = LocalDateTime.parse(end.toString() + "T23:59:59");
String startTime = startDateTime.format(DatePattern.NORM_DATETIME_FORMATTER);
String endTime = endDateTime.format(DatePattern.NORM_DATETIME_FORMATTER);
return CollUtil.newArrayList(startTime, endTime);
}
},
MONTHS(1, "每月"){
@Override
public Boolean checkPeriod(Date date) {
String format = DateUtil.format(date, DatePattern.NORM_MONTH_PATTERN);
String months = LocalDate.now().minusMonths(1L).format(DatePattern.NORM_MONTH_FORMATTER);
return StrUtil.equalsIgnoreCase(format,months);
}
@Override
public List<String> getPeriod(LocalDate date) {
LocalDate today = LocalDate.now();
Month month = today.getMonth();
int length = month.length(today.isLeapYear());
LocalDate start = LocalDate.of(today.getYear(), month, 1);
LocalDateTime startDateTime = LocalDateTime.parse(start.toString() + "T00:00:00");
LocalDate end = LocalDate.of(today.getYear(), month, length);
LocalDateTime endDateTime = LocalDateTime.parse(end.toString() + "T23:59:59");
String startTime = startDateTime.format(DatePattern.NORM_DATETIME_FORMATTER);
String endTime = endDateTime.format(DatePattern.NORM_DATETIME_FORMATTER);
return CollUtil.newArrayList(startTime, endTime);
}
};
private final Integer value;
private final String desc;
InspectPeriod(int value, String desc) {
this.value = value;
this.desc = desc;
}
public static InspectPeriod getInspectPeriod(int value) {
for (InspectPeriod item : InspectPeriod.values()) {
if (value == item.getValue()) {
return item;
}
}
return null;
}
public static List<InspectPeriod> getInspectPeriodList(int value) {
return Stream.of(InspectPeriod.values()).collect(Collectors.toList());
}
// @Override
public Integer getValue() {
return value;
}
// @Override
public String getDesc() {
return desc;
}
public abstract Boolean checkPeriod(Date date);
public abstract List<String> getPeriod(LocalDate date);
public static void main(String[] args) {
List<InspectPeriod> collect = Arrays.stream(values()).collect(Collectors.toList());
// 打印周期的开始时间和结束时间
collect.forEach(item-> System.out.println(item.getPeriod(LocalDate.now())));
}
}
运行结果
每年:[2023-01-01 00:00:00, 2023-12-31 23:59:59]
每周:[2023-02-06 00:00:00, 2023-02-12 23:59:59]
每月:[2023-02-01 00:00:00, 2023-02-28 23:59:59]