java - 及时建模对象状态变化的最佳实践?

标签 java oop design-patterns state-pattern

我目前正在开发一个 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/

相关文章:

java - 在 XPage 应用程序中使用 docx4j

java - JVM指令栈式架构的优点

java - 寻找设计模式和列表来存储多种类型(对象和整数)

java - 我们可以通过非私有(private)的instanceName来创建一个Singleton类吗?

java - ThreadLocal 垃圾回收

Java 按字典顺序比较顶点

java - 设计问题: RMI needs explicit exporting of objects

java - 匿名对象的 Scala 语法

unit-testing - 为单元测试优化一个类是好的做法,还是为时过早?

javascript - Javascript 中大量计算的最佳实践?