Наблюдатель - наблюдаемая модель логики получения электронной почты

У меня написана логика получения электронной почты (имя класса: 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?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
173
1

Ответы 1

Вы должны вызвать в 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
}

В моем классе Mail_Receive_Logic (т. Е. Класс принадлежит объекту receiveMail) я написал строку notifyObservers(messages);. Это неправильно? или мне нужно писать, как ты в основном классе?

ahrooran 04.12.2018 15:46

Я думаю, вы хотите вызвать receiveMail.notifyObservers(messages) сразу после receiveMail.receive(), поскольку я предполагаю, что именно так вы получаете свой объект messages, и, таким образом, у вас будет видимость для передачи сообщений вашим наблюдателям.

Mike 04.12.2018 16:03

Другие вопросы по теме