基于枚举方式实现策略模式

该代码示例展示了如何在Java中基于枚举实现策略模式,用于处理不同的日期检查和获取周期。枚举包括YEAR、WEEK和MONTHS,分别对应每年、每周和每月的检查,提供checkPeriod方法判断给定日期是否在当前周期内,以及getPeriod方法获取周期的开始和结束时间。
摘要由CSDN通过智能技术生成

基于枚举方式实现策略模式

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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值