шаблон проектирования observer в java

#java #design-patterns

#java #шаблоны проектирования

Вопрос:

У меня есть следующее уведомление, отправленное для наблюдателя и наблюдаемого шаблона проектирования

 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) {

    }
  

Как мне проверить, соответствует ли это сезону, времени суток или температуре?

Комментарии:

1. Каковы типы сезона и времени суток?

2. Этот пост может быть интересен для вас. В нем описывается, как построить реализацию шаблона проектирования Observer с использованием современных средств Java

Ответ №1:

Вы можете использовать шаблон observer в режиме извлечения , что означает, что observable сам перейдет к observer’ам update() .Таким образом, observer может получать нужные свойства из средств получения observable .

Я предполагаю, что 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(){....}

}
  

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

 public void update(Observable o, Object arg) {

   Subject = (Subject) o;
   int temperature = o.getTemperature();
   int dayInTime= o.getdayInTime();
   int season= o.getSeason();
}
  

Ответ №2:

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

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

Ответ №3:

Вы можете вызвать, notifyObservers("season"); и в Observer’s update(Observable o, Object arg) вторым параметром будет строка "season" .

Или объявляется enum MyAttr {Season, DayInTime, Temperature} и вызывается notifyObservers(MyAttr.Season);

Ответ №4:

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

 notifyObservers(season, dayInTime, temperature)
  

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