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