如何设计一个对象状态会根据时间变化的类?

时间:2013-07-18 12:32:57

标签: class oop design-patterns object

我有一个有生命周期的课程,也就是说,经过一段时间后,它的一些属性会有所不同(即:如果你不喝水一会儿就会感到口渴)。现在我正在做的是有另一个不断调用的类(循环调用x每分钟的时间量)第一个上的一些方法,在那里我检查上一次检查完成并执行相应的动作。但是,我希望有一些更清洁的东西,或许可以使用一些模式来以更优雅的方式分离“观察”对象的责任。我希望它很清楚,否则我可以提供一些代码

5 个答案:

答案 0 :(得分:1)

你可以使用“滴答声”。 使用tick变量(整数)。 每次调用方法时,将tick变量递增1。

例如, 如果你希望角色(或其他)在250个滴答之后感觉到爆发,只需将刻度模数除以250并检查结果是否为0。

答案 1 :(得分:0)

我要做的是将对象初始化时的系统日期记录为对象的属性。然后,不是“观察”对象,而是在对象内部通过比较初始时间和当前时间来返回状态。

使用while循环不一定能解决你的问题......但根据你的实现,你可能不需要while循环(你可以在适合你时调用这个对象方法)

编辑:

例如

(抽象,这不是一种语言。从你的平台替代方法)

//MyObject.h
enum {
    NormalObjectState = 0,
    ThirstyObjectState = 1
} ObjectState;

SystemDate _initSystemDate;
-(ObjectState) returnObjectState;

//MyObject.m
- (MyObject) init {
  SystemDate currentTime = GetSystemTime();
  _initSystemTime = currentTime;
  return self;
}

-(ObjectState) returnObjectState {
     SystemDate currentTime = GetSystemTime();
     SystemDateInterval timeInterval = GetTimePassed(_initSystemTime, CurrentTime);
     ObjectState currentState = NormalObjectState;
     if (timeInterval > 60) { //minute passed
         currentState = ThirstyObjectState;
     } 
     return currentState;
}

//in your program code
#import MyObject.h

//...

while (x) {
   ObjectState currentObjectState = [object returnObjectState];
   if (currentObjectState == NormalObjectState) {
      print ("I'm normal");
   } else {
      print ("I'm thirsty");
      [thisClass drinkWater];
   }
}

- (void) drinkWater {
    SystemDate currentTime = GetSystemTime();
    _initSystemTime = currentTime;
}

答案 2 :(得分:0)

首先,我同意@Justin Amberson所说的概念,其概念是:

  

当状态为“请求”时,对象的状态将“改变”

这将是一种方式,但这可能取决于。

仅基于你的问题标题,上面的概念可能就足够了,但是(这与上下文完成的这种行为有关)如果这应该是一种“自动”行为,这可以通过内部实现一种简单的“调度器”或“定时器”,根据物体状态,它将等待一段时间直到下一个状态发生;如果“请求”操作(阻止状态改变),则“定时器”正在等待,例如。 “从现在起5分钟前喝水”“计时器”将被重新安排到下次状态变化的下一次发生。

正如我之前所说,这只是“想象力”,因为仅基于你的问题标题和文字,第一个概念应该足够了,其余概念超出了你的问题范围。

答案 3 :(得分:0)

IMHO有一个自动更改状态的对象并不是一件好事,所以我认为没有设计模式。

正如有人向你建议我认为在你的对象中有一个creationDate变量(或类似的东西)以及几种检查对象“需求”的方法可能是一个好主意。例如:

boolean isThirsty(){
    return (now - lastDrinkDate > MAX_INTERVAL);
}

答案 4 :(得分:0)

首先,必须在课堂内处理变化;这只是适当的OOP。如其他地方所述,最好的方法是在请求时计算每个值。

如果失败,你想运行一个计时器。理想情况下,您可以获得一个将在某种队列中运行的东西(如Java EventQueue)。这使一切都在一个线程中。否则你运行多线程,这可能有点有趣。

最有可能的是,您可以从其他类中获取代码并将其放入此类中。无论如何,该代码已经必须解决这些问题。

在哪里启动计时器可能是一个技巧。如果您已经拥有某种类型的激活方法,那么您已经完成了设置。否则,如果你不是多线程的,只需在构造函数中启动它,这样就可以从一开始就准备好了。 (除非你想在一个会话中多次启动和停止它。)你可以甚至运行多线程,但如果你(或其他任何人)粗心或忘记,其他代码可以访问完全初始化之前的类。或者,如果没有运行定时器,新构建的实例尚未完全初始化,因此即使使用activate方法也会遇到同样的问题。 (我倾向于在两者之间摇摆不定,为每个案例选择最不好的解决方案。希望你不是多线程的。)

如果整个会话可能不需要类实例,那么您需要一个“dispose”方法,以及一个调用它的地方。 (如果你有一个“激活”方法,请改为使用“deactivate”方法。在sessioin中多次激活和停用对象可能是有意义的。)