我目前正在开发一个 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
}
而且,许多州,其中一些取决于开始/结束日期。就像在 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
}
我当前的方法是一个 Scheduler 类,它每分钟检查每个事件,并以这种方式更新状态。
考虑到我的应用程序中将有许多事件实例,在使用状态模式时是否有任何建议或方法来检查基于时间的条件?或者我不应该特别使用这些状态的状态模式?
最佳答案
My current approach is a Scheduler class that checks every Event a minute, and updates the states that way.
每个对象都必须承担特定的职责。
所以我不认为更新状态是调度程序的角色。
调度程序应在每个选定的时间间隔调用事件元素上的方法,例如 timeChanged(Instant now) ,以允许它们应用执行状态更改(如果有)的逻辑。
Considering that I will have many instances of Event in my application, is there any recommendation or approach to checking for time-based conditions when using the state pattern?
你的方法相当不错。另一种方法可以是直接在事件中创建计时器,但 1)创建多个计时器会产生成本,2)它在事件类中收集更多责任。
请注意,如果事件处理的顺序并不重要并且不共享状态,您可以并行化来自调度程序的通知,因为您有很多通知。
使用ExecutorService
,例如:
List<Callable<Void>> timeChangedTasks = ...;
ExecutorService.invokeAll(timeChangedTasks);
或者使用并行流:
Instant now = Instant.now();
events.parallelStream()
.forEach(e-> e.timeChanged(now));
关于java - 及时建模对象状态变化的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54479066/