шаблон проектирования наблюдателя в Java - PullRequest
1 голос
/ 14 ноября 2011

У меня есть следующее уведомление для шаблона проектирования 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 ]

2 голосов
/ 14 ноября 2011

Вы можете использовать шаблон наблюдателя в режиме извлечения, что означает, что наблюдаемое передаст себя наблюдателю 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(){....}

}

Тогда ваш наблюдатель может получить температуру, dayInTime, сезон, используя соответствующие методы получения вашего Observable:

public void update(Observable o, Object arg) {

   Subject = (Subject) o;
   int temperature = o.getTemperature();
   int dayInTime= o.getdayInTime();
   int season= o.getSeason();
}
2 голосов
/ 14 ноября 2011

Согласно вашему коду, arg в update(Observable o, Object arg) будет одним из времени года, дня или времени.Аргумент notifyObservers() - это то, что передается update().

Возможно, вы захотите включить больше метаданных в пользовательский объект 'event' и использовать его в качестве аргумента для своих вызовов к notifyObservers().

1 голос
/ 14 ноября 2011

Вы можете вызвать notifyObservers("season");, а в update(Observable o, Object arg) Наблюдателя вторым параметром будет строка "season".

Или объявить enum MyAttr {Season, DayInTime, Temperature} и позвонить notifyObservers(MyAttr.Season);

0 голосов
/ 14 ноября 2011

Если season, dayInTime и temperature следует отправлять наблюдателю одновременно, может быть лучше позвонить:

notifyObservers(season, dayInTime, temperature)

и Observer может иметь метод update(Object season, Object dayInTime, Object temperature), теперь вы знаете, сезон ли это, день или время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...