我发送了以下针对Observer和Observable设计模式的通知
private void changeEnvironment()
{
Random random = new Random();
season = SEASON[random.nextInt(3)];
dayInTime = DAY_IN_TIME[random.nextInt(2)];
temperature = random.nextInt(120);
setChanged();
notifyObservers(season);
notifyObservers(dayInTime);
notifyObservers(temperature);
}
然而,在我的:
public void update(Observable o, Object arg) {
}
如何检查季节,dayInTime或温度?
答案 0 :(得分:2)
根据您的代码,arg
中的update(Observable o, Object arg)
将是季节,dayInTime或温度之一。 notifyObservers()
的参数是传递给update()
的内容。
您可能希望在自定义“事件”对象中包含更多元数据,并将其用作调用notifyObservers()
的参数。
答案 1 :(得分:2)
你可以在拉模式下使用观察者模式,这意味着observable会将自己传递给观察者的update()
。因此,观察者可以从观察者的吸气者那里获得他们想要的属性。
我认为您主题中的temperature
,dayInTime
,season
都是int
所以,你Observable
(即主题)看起来像是:
public class Subject extends Observable{
private int temperature;
private int dayInTime;
private int season;
private void changeEnvironment() {
Random random = new Random();
this.season = SEASON[random.nextInt(3)];
this.dayInTime = DAY_IN_TIME[random.nextInt(2)];
this.temperature = random.nextInt(120);
setChanged();
/** Notify all of the subscribed observers about its changes
It will call each observers' update(this, null)***/
notifyObservers();
}
public int getTemperature(){....}
public int getdayInTime(){.....}
public int getSeason(){....}
}
然后你的观察者可以通过使用你的Observable的相应吸气剂获得温度,dayInTime,季节:
public void update(Observable o, Object arg) {
Subject = (Subject) o;
int temperature = o.getTemperature();
int dayInTime= o.getdayInTime();
int season= o.getSeason();
}
答案 2 :(得分:1)
您可以致电notifyObservers("season");
,在观察者的update(Observable o, Object arg)
中,第二个参数将是字符串"season"
。
或宣布enum MyAttr {Season, DayInTime, Temperature}
并致电notifyObservers(MyAttr.Season);
答案 3 :(得分:0)
如果season
,dayInTime
和temperature
应同时发送给观察者,最好致电:
notifyObservers(season, dayInTime, temperature)
和Observer
可以有方法update(Object season, Object dayInTime, Object temperature)
,现在你知道它是季节,dayInTime还是温度。