我目前正在使用Java Web应用程序,并且在尝试对依赖于开始/结束日期的对象的状态变化进行建模时遇到麻烦。
由于我需要在运行时更改状态,因此我遵循状态的状态模式,但是我对检查更改状态的条件的正确方法表示怀疑。例如,我有一个简单的Event类,其抽象的EventState为空:
public class Event {
private Long id;
private String title;
private LocalDate startDate; //mm/dd/yyyy
private LocalTime startTime; //hour:minutes
private LocalDate endDate; //mm/dd/yyyy
private LocalTime endTime; //hour:minutes
private EventState eventState;
...
//getters, setters, validation,etc
}
还有许多状态,其中某些状态取决于start / endDate。就像在startDate中自动开始一个事件,并在endDate中完成一个事件一样:
public class StartedState extends EventState {
//my methods that works for a started Event
}
public class FinishedState extends EventState {
//my methods that works for a finished Event
}
我当前的方法是调度程序类,该类每分钟检查一次每个事件,并以此方式更新状态。
考虑到我的应用程序中将有很多Event实例,使用状态模式时是否有任何建议或方法来检查基于时间的条件?还是我不应该特别针对那些状态使用状态模式?
答案 0 :(得分:1)
我目前的方法是调度程序类,它检查每个事件 分钟,然后以这种方式更新状态。
每个对象都必须承担特定的责任。
因此,我认为更新状态不是调度程序角色。
调度器应该在调用方法中的每个选择的时间间隔,例如timeChanged(Instant now)
在事件元素,以允许他们申请,做状态改变,如果它具有逻辑。
考虑到我的事件将有很多实例 应用程序,是否有任何建议或方法来检查的 使用状态模式时基于时间的条件?
您的方式相当不错。另一种方法可以直接在活动,但1创建定时器)为您创建多个定时器,2)它收集在事件类的更多责任,它的成本。
请注意,如果事件处理的顺序并不重要,它不共享状态,你可以从调度并行的通知,因为你有很多。
使用ExecutorService
,例如:
List<Callable<Void>> timeChangedTasks = ...;
ExecutorService.invokeAll(timeChangedTasks);
或带有并行流:
Instant now = Instant.now();
events.parallelStream()
.forEach(e-> e.timeChanged(now));