繁体   English   中英

观察者如何订阅可观察物?

[英]How observers subscribe on observables?

我已经读过一本名为《 Head First Pattern》的书,并且对“ Observer”模式有疑问。

如果观察者的API仅包含1个方法“ update()”,那么观察者应如何订阅它呢?

首先,我假设观察者必须包含方法“ subscribe(Observable observable)”

如何以最佳方式实施订阅机制?

实际上,这是另一回事。 您将Observer附加或添加到将被观察的对象Observable 这样做是为了使观察到的对象一旦状态改变就能够notify观察者。

在这种模式中,如果您要在观察者对象中订阅Subject ,则只能这样做。 观察者如何知道行为发生时对象的状态何时发生变化? 也许观察者可以开始轮询并询问对象的状态,直到状态改变为止,然后观察者将对此采取行动。 但这远非理想。

这就是WatchService所发生的情况,例如,您在其中将文件添加到服务中以便在文件被修改后得到通知。 大致来说,您是在观察者中“订阅”主题。 但是,在这里,您将启动一项服务,该服务将照顾您的幕后需求。

无论如何,在您的情况下,最好的方法是让主题对象管理观察者并在适当的时候调用它。

查看此链接: https : //sourcemaking.com/design_patterns/observer

您必须实现您的Subject类,以便它接收将观察其行为并根据需要通知的实体。 当进行了所需的更改时, Subject's责任notify观察者。

Java有其自己的模式实现。 您应该先阅读Observable类以获取要点。 然后,您应该按照已阅读的指南实施自己的指南。 这个想法是这样的:

import java.util.ArrayList;
import java.util.List;

public class TestObserver {
    public static void main(String[] args) {
        Subject subject = new Subject();
        ContentObserver contentObs = new ContentObserver();
        subject.addObserver(contentObs);
        // Once you call setContent, the object contentObs
        // will be notified and print the desired text
        subject.setContent("test");
    }
}

class Subject {

    private String content;

    private List<ContentObserver> observers = new ArrayList<>();

    public void addObserver(ContentObserver obs) {
        observers.add(obs);
    }

    public void setContent(String content) {
        this.content = content;
        notifyContentObservers();
    }

    private void notifyContentObservers() {
        observers.forEach(obs -> obs.update(content));
    }

}

class ContentObserver {

    public void update(String content) {
        System.out.println("Content was changed! New content = " + content);
    }

}

请记住,这是一个示例。 您必须通过添加,删除等方式来管理观察者。也建议对接口进行编码 ,因此您应该根据要观察的内容创建自己的Observer接口。

此外,你不应该使用Java提供的实现,因为它在Java 9弃用: https://docs.oracle.com/javase/9​​/docs/api/java/util/Observable.html https://开头dzone。 COM /用品/ Java类观察者和观察的,被弃用,在-JD

如果您想要更可靠和反应更快的产品。 看看: https : //docs.oracle.com/javase/9​​/docs/api/java/util/concurrent/Flow.html

干杯!

 observable.addObserver(observer);
 // now when observable changes, the observer will know

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM