Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 观察者是如何看待可观察事物的?_Java - Fatal编程技术网

Java 观察者是如何看待可观察事物的?

Java 观察者是如何看待可观察事物的?,java,Java,我读过一本名为“头优先模式”的书,对模式“观察者”有一个问题 如果observable的API只包含1个方法“update()”,那么观察者应该如何订阅observable 首先,我假设observer必须包含方法“subscribe(Observable-Observable)” 如何以最佳方式实现订阅机制?事实上,这是另一种方式。将观察者附加或添加到要观察的对象,即可观察者。您可以这样做,以便观察到的对象能够在其状态发生变化时通知观察者 在这种模式中,如果您要在observer对象中订阅主题

我读过一本名为“头优先模式”的书,对模式“观察者”有一个问题

如果observable的API只包含1个方法“update()”,那么观察者应该如何订阅observable

首先,我假设observer必须包含方法“subscribe(Observable-Observable)”


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

事实上,这是另一种方式。将
观察者
附加或添加到要观察的对象,即
可观察者
。您可以这样做,以便观察到的对象能够在其状态发生变化时通知观察者

在这种模式中,如果您要在observer对象中订阅
主题
,并且只这样做。观察者怎么知道在动作发生的那一刻主体的状态发生了变化?也许观察者可以开始轮询并询问受试者的状态,直到它发生变化,然后观察者就会对其采取行动。但这远非理想

这就是
WatchService
所发生的情况,例如,在该服务中,您向服务添加一个文件,以便在文件被修改后收到通知。大致上,您是在“订阅”观察者中的主题。但在这里,你开始一项服务,将照顾你需要的幕后工作

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

查看此链接:

您必须实现类
Subject
,以便它接收实体,这些实体将观察其行为并根据需要得到通知。这是
主题的
当进行所需更改时,
通知观察员的职责

Java有自己的模式实现。你应该从阅读课文开始,了解它的要点。然后,你应该按照你读过的指导方针来实现你自己的。这个想法是这样的:

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);
    }

}
import java.util.ArrayList;
导入java.util.List;
公共类TestObserver{
公共静态void main(字符串[]args){
主题=新主题();
ContentObserver contentObs=新ContentObserver();
subject.addObserver(contentObs);
//调用setContent后,对象contentObs
//将收到通知并打印所需文本
主题。设置内容(“测试”);
}
}
班级科目{
私有字符串内容;
私有列表观察员=新的ArrayList();
public void addObserver(ContentObserver obs){
新增观察员(obs);
}
公共void setContent(字符串内容){
this.content=内容;
notifycontentobsers();
}
私有void notifyContentObservators(){
observer.forEach(obs->obs.update(content));
}
}
类内容观察者{
公共无效更新(字符串内容){
System.out.println(“内容已更改!新内容=“+Content”);
}
}
记住,这是一个例子。您必须通过添加、删除等方式管理您的观察者。此外,建议您根据您想要观察的内容创建自己的
Observer
界面

此外,您不应该使用java提供的实现,因为java 9中不推荐使用它:

如果你想要更可靠、更具反应性的东西。看看:


干杯

我刚刚在同一页上发布了一个类似问题的答案(几分钟前):谢谢!我只是想知道为什么“ContentObserver”没有“subscribe”方法?如果一个对象想成为任何主体的观察者,它应该做什么?它应该被添加到主体的观察者列表中。例如,在我的示例中,通过以下调用:subject.addObserver(contentObs)yes。但是按照这个模式,是否可以向一个类似subscribe(Subject s){s.addObserver(this);}的观察者添加一个方法呢?噢!我抓到你了!问题是,如果您在observer中订阅了一个主题,并且只这样做。观察者如何知道受试者的状态何时改变?如果观察者是管理受试者的响应者,如果受试者没有办法通知观察者,他将永远不会得到通知。我说清楚了吗?我想我理解你的想法。我已经编辑了我的答案并扩展了解释。看一看,告诉我你的想法。干杯
 observable.addObserver(observer);
 // now when observable changes, the observer will know