#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)
, теперь вы знаете, сезон это, время суток или температура.