У меня написана логика получения электронной почты (имя класса: Mail_Receive_Logic). Этот класс загружает все мои непрочитанные электронные письма в массив messages.
Еще у меня есть классы EmailStatPrinter и классы EmailStatRecorder. EmailStatPrinter имеет метод writeToConsole, который выводит массив на экран. EmailStatRecorder имеет метод writeToFile, который записывает массив в текстовый файл.
Я хочу реализовать эту логику так, чтобы это было доступно наблюдателю.
public class Mail_Receive_Logic extends Observable{
public class EmailStatPrinter implements Observer{
public class EmailStatRecorder implements Observer{
Мой основной метод выглядит так
public static void main(String[] args) throws ClassNotFoundException {
// observable
Mail_Receive_Logic receiveMail = new Mail_Receive_Logic(usernameReceiving, passwordReceiving, fileReceivePath);
// observer
EmailStatPrinter writeToConsole = new EmailStatPrinter();
EmailStatRecorder writeToFile = new EmailStatRecorder();
receiveMail.addObserver(writeToConsole);
receiveMail.addObserver(writeToFile);
Thread receive = new Thread (new Runnable() {
public void run() {
try {
while (true) {
receiveMail.receive();
}
} catch (InterruptedException e) {}
}
});
receive.start();
Как мне написать метод обновления каждого класса наблюдателя, чтобы они принимали массив сообщений и печатали его на консоли и в текстовом файле. т.е. я хочу знать, что писать в следующем сегменте кода для каждого класса наблюдателя.
@Override
public void update(Observable o, Object arg) {
// TODO Auto-generated method stub
}
Пожалуйста, также объясните мне, почему есть две переменные Observable o и Object arg?




Вы должны вызвать в Observable.notifyObservers() и предоставить arg. Это может быть что угодно. В вашем случае, я думаю, вам нужно что-то вроде:
try {
while (true) {
receiveMail.receive();
receiveMail.notifyObservers(messages);
}
}
catch (InterruptedException e) {
}
Тогда в ваших наблюдателях вы получите сообщения как:
@Override
public void update(Observable o, Object arg) {
// The first arg is the thing you were observing (receiveMail in this case)
// The second arg is the messages that was passed by the receiveMail instance
}
Я думаю, вы хотите вызвать receiveMail.notifyObservers(messages) сразу после receiveMail.receive(), поскольку я предполагаю, что именно так вы получаете свой объект messages, и, таким образом, у вас будет видимость для передачи сообщений вашим наблюдателям.
В моем классе Mail_Receive_Logic (т. Е. Класс принадлежит объекту receiveMail) я написал строку
notifyObservers(messages);. Это неправильно? или мне нужно писать, как ты в основном классе?