当前位置: 首页 > 面试题库 >

我们什么时候应该使用Observer和Observable?

岳炎彬
2023-03-14
问题内容

面试官问我:

什么是Observer,什么Observable时候应该使用它们?

我并不了解这些术语,因此当我回到家并开始使用GoogleObserver和Google搜索时Observable,从不同的资源中发现了一些要点:

1)Observable是一个类,Observer是一个接口。

2)Observable该类维护一个Observers的列表。

3)当一个Observable对象被更新时,它调用其update()每个Observers的方法来通知它已被更改。

我发现这个例子:

import java.util.Observable;
import java.util.Observer;

class MessageBoard extends Observable
{
    public void changeMessage(String message) 
    {
        setChanged();
        notifyObservers(message);
    }
}

class Student implements Observer 
{
    @Override
    html" target="_blank">public void update(Observable o, Object arg) 
    {
        System.out.println("Message board changed: " + arg);
    }
}

public class MessageBoardTest 
{
    public static void main(String[] args) 
    {
        MessageBoard board = new MessageBoard();
        Student bob = new Student();
        Student joe = new Student();
        board.addObserver(bob);
        board.addObserver(joe);
        board.changeMessage("More Homework!");
    }
}

但是我不明白为什么我们需要ObserverObservable?的用途setChanged()``和notifyObservers(message)方法是什么?


问题答案:

您有一个学生和一个留言板的具体示例。学生将自己添加到希望在新消息发布到MessageBoard时得到通知的观察者列表中进行注册。将消息添加到MessageBoard时,它将遍历其Observers列表,并通知他们事件已发生。

想想Twitter。当您说要关注某人时,Twitter会将您添加到他们的关注者列表中。当他们发送新推文时,您会在输入中看到它。在这种情况下,您的Twitter帐户是观察者,而您关注的人是观察者。

这个类比可能并不完美,因为Twitter更可能是调解人。但这说明了这一点。



 类似资料:
  • 问题内容: 什么是,什么时候应该使用它们? 我并不了解这些术语,因此当我回到家并开始使用Google Observer和Google搜索时,发现了来自不同资源的一些观点: 1)是一个类,是一个接口。 2)该类维护一个 列表。 3)当一个对象被更新时,它调用其每个的方法来通知它已被更改。 我发现这个例子: 但是我不明白为什么我们需要和?的用途和方法是什么? 问题答案: 有一个学生和一个留言板的具体示

  • 问题内容: 我正在使用’multiprocess.Pool.imap_unordered’如下 我需要打电话或之后的for循环? 问题答案: 不,您没有,但是如果您不再使用游泳池,那可能是个好主意。 Tim Peters在此SO帖子中致电或致电的理由很明确: 至于Pool.close(),您应该在永远不会将更多工作提交给Pool实例的情况下(且仅在)进行调用。因此,通常在主程序的可并行化部分完成时

  • 问题内容: 我在ORM上还很新。我刚刚开始阅读有关使用Hibernate的Java Persistence API的书籍和文档。 我只是想知道,关闭EntityManagerFactory与jdbc数据库连接关闭类似吗? 我们是否应该在每次持久/更新/删除后关闭它?如果我们不关闭它,数据库连接会保持打开状态吗? 问题答案: 我只是想知道,关闭与jdbc数据库连接关闭类似吗? 这并非完全正确,但关闭

  • 问题内容: 我仍然是React的菜鸟,在互联网上的许多示例中,我看到了渲染子元素时出现的这种变化,我感到困惑。通常我看到以下内容: 但是然后我看到一个这样的例子: 现在,我了解了api,但是文档并未确切说明我何时应该使用它。 那么,一个人做什么却另一个人不能做什么呢?有人可以用更好的例子向我解释吗? 问题答案: 编辑: 相反,请看Vennesa的答案,这是一个更好的解释。 原版的: 首先,该示例仅

  • 问题内容: 有什么区别?什么时候应该使用容量为1的对抗? 问题答案: SynchronousQueue更像是一个传递,而LinkedBlockingQueue仅允许单个元素。区别在于对SynchronousQueue的put()调用直到有相应的take()调用 才返回 ,但LinkedBlockingQueue的大小为1,则put()调用(对空队列)将立即返回。 我不能说自己曾经直接使用过Sync

  • 问题内容: 我对使用和翻译有疑问。我了解到,在模型中,我应该使用。但是还有其他地方我也应该使用吗?表单定义呢?它们之间是否存在性能差异? 编辑: 还有一件事。有时候,代替被使用。正如文档所述,仅在将字符串显示给用户之前,才将字符串标记为要翻译,并在可能的最新情况下进行翻译,但是我在这里有点困惑,这与功能相似吗?我仍然很难决定在模型和表格中应该使用哪个。 问题答案: ugettext() 与 uge