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

时间:2017-12-03 00:49:03

标签: java

我读过一本名为" Head First Pattern"并对模式" Observer"。

提出疑问

如果观察者的API仅包含1种方法" update()"?

,观察者如何订阅观察者?

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

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

2 个答案:

答案 0 :(得分:2)

实际上,反之亦然。您将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);
    }

}

请记住,这是一个例子。您必须通过添加,删除等来管理您的观察者。code to an interface也建议您这样做,因此您应该根据要观察的内容创建自己的Observer界面。

此外,您不应该使用java提供的实现,因为它在Java 9中已弃用: https://docs.oracle.com/javase/9/docs/api/java/util/Observable.html https://dzone.com/articles/javas-observer-and-observable-are-deprecated-in-jd

如果你想要更可靠和反应更强的东西。看一眼: https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/Flow.html

干杯!

答案 1 :(得分:0)

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