是否有任何模式可以按计划更改对象的状态?

Is there any pattern for changing the state of the object on schedule?

情况如下:

问题是:有没有什么模式可以让我控制对象的状态并相应地改变它们?例如,我可以每 30 分钟 运行 一些脚本,select 所有对象,检查它们的状态并更改它们。但是这种方法看起来不太理想,我正在尝试找出更好的方法。

编辑 运行 例行程序每 30 分钟增加一次数据库负载(因为每次我都需要 select 记录进行分析)。我正在尝试找到一个解决方案:

  1. 对 RDBMS 的请求最少(MySQL 在我的例子中)
  2. 在实际状态更改和例程开始时间之间产生最小延迟(运行每 30 分钟执行一次例程意味着某些记录最多会延迟 30 分钟更改其状态)
  3. 可扩展,因为可能有更多状态需要支持(这就是为什么 JB Nizet 的回答对我不起作用)

我可以使用一些智能调度程序,在内存中保留像 timestamp -> [(object_id, next_state)] 这样的有序映射(此任务最多可使用 128G)。

您不应该将状态存储在数据库中。你应该在它变质和变质的那一刻储存起来。

这样一来,您就不需要更改数据库中的任何内容。

要获得变质的物品,您只需要像

这样的查询
select * from item where now() >= spoileddate

要获取陈旧的项目,您只需要像

这样的查询
select * from item where now() >= staledate and now() < spoileddate

要获得新鲜的商品,您只需要像

这样的查询
select * from item where now() < staledate

顺便说一句,这还有另一个优势:您可以在任何给定时间了解项目的状态,而不仅仅是其当前状态。因此,如果您接到 phone 电话询问 "I ate product xyz three days ago, am I safe?",您可以接听。

JB Nizet 所述,状态 属性 不需要存储在数据库中。

一般来说,定期执行某些 clean-up、维护等工作的实体的设计模式称为 Agent 设计模式。

你的情况:

class FoodStateAgent
{
    void Run()  // called periodically from a Scheduler
    {
        // ...
    }
};

代理通常与 调度程序 一起工作 - 类 负责 运行 在其定义的截止日期前执行特定操作。