java中的观察者设计模式

时间:2011-11-14 05:45:12

标签: java design-patterns

我发送了以下针对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或温度?

4 个答案:

答案 0 :(得分:2)

根据您的代码,arg中的update(Observable o, Object arg)将是季节,dayInTime或温度之一。 notifyObservers()的参数是传递给update()的内容。

您可能希望在自定义“事件”对象中包含更多元数据,并将其用作调用notifyObservers()的参数。

答案 1 :(得分:2)

你可以在拉模式下使用观察者模式,这意味着observable会将自己传递给观察者的update()。因此,观察者可以从观察者的吸气者那里获得他们想要的属性。

我认为您主题中的temperaturedayInTimeseason都是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)

如果seasondayInTimetemperature应同时发送给观察者,最好致电:

notifyObservers(season, dayInTime, temperature)

Observer可以有方法update(Object season, Object dayInTime, Object temperature),现在你知道它是季节,dayInTime还是温度。