【问题标题】:Observer - Observable model around an email receiving logicObserver - 围绕电子邮件接收逻辑的可观察模型
【发布时间】:2019-05-05 23:48:53
【问题描述】:

我写了一个电子邮件接收逻辑(类名:Mail_Receive_Logic)。这个类将我所有的未读邮件下载到一个messages 数组中。

我还有 EmailStatPrinterEmailStatRecorder 课程。 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

    }

还请解释一下为什么有 2 个变量 Observable o 和 Object arg?

【问题讨论】:

    标签: java observable observer-pattern observers


    【解决方案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);。错了吗?还是我必须像你在主课上那样写?
    • 我想你想在receiveMail.receive() 之后立即调用receiveMail.notifyObservers(messages),因为我假设这就是你获取messages 对象的方式,因此你可以看到将消息传递给观察者的地方.
    猜你喜欢
    • 2020-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    相关资源
    最近更新 更多