为对象状态变化建模的最佳实践?

时间:2019-02-01 11:58:57

标签: java oop design-patterns state

我目前正在使用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实例,使用状态模式时是否有任何建议或方法来检查基于时间的条件?还是我不应该特别针对那些状态使用状态模式?

1 个答案:

答案 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));