【问题标题】:What's the point of observer pattern?观察者模式有什么意义?
【发布时间】:2015-06-22 22:06:57
【问题描述】:

我目前正在学习 Java,这很有趣,但有些东西确实让我很烦恼。我了解如何使用观察者模式,但我找不到任何真正的用途。我显然已经看到了一些示例,但我发现它会使代码变得更加复杂,并且有许多更简单的方法可以做这些事情。

因此,如果有人有一个简单的解释/示例,其中观察者模式确实有一个实用程序,我将不胜感激。

谢谢

【问题讨论】:

标签: java design-patterns


【解决方案1】:

您在 Stack Overflow 上发布了一个问题,我们都收到了一个问题已发布的通知。这就是观察者模式。

【讨论】:

  • 我们收到通知了吗?我不了解你,但我必须检查 stackoverflow 页面才能看到这个问题,所以我不必订阅主题,然后主动通知,实际上我必须 poll stackoverflow 以获取更新.这不是观察者模式。
  • @meriton Web 套接字,如果你有的话。
  • 我们收到类似“2 个新问题”之类的通知。它甚至改变了我们浏览器的标题栏。然后我们可以提出这些新问题。默认情况下它不会加载这些问题,而是让我们知道发布了新问题。
  • 当有人回答时,提出问题的人也会收到通知
【解决方案2】:

为了一个简单的好例子,让我们假设操作系统是用 Java 编写的。然后我们会有一个类Mouse,以及许多想要响应鼠标点击的应用程序。

一种简单的方法是让每个应用程序不断询问鼠标当前是否按下了鼠标按钮:

class MyApplication {
    void run() {
        for (;;) {
            if (Mouse.isLeftButtonDown()) {
                // do something
            }
        }
    }
}

这有一个缺点,如果没有按下鼠标按钮,我们有一个线程不断执行该循环。如果每个应用程序都这样做,这尤其糟糕。您的 CPU 会一直忙于检查鼠标,不必要地消耗能量,并导致其他进程和程序变慢。第一个改进是在循环中添加一个短暂的睡眠延迟:

class MyApplication {
    Mouse mouse;

    void run() {
        for (;;) {
            if (mouse.isLeftButtonDown()) {
                // do something
            }
            Thread.sleep(50);
        }
    }
}

这将节省 cpu 时间,但如果鼠标按钮按下的时间少于 50 毫秒(或者程序错误的应用程序的另一个线程占用了 cpu,导致我们的线程无法运行),应用程序可能不会注意到点击。

这些问题可以通过使用观察者模式巧妙地避免,鼠标作为主体,各种应用程序(或窗口)作为监听器:

class MyApplication implements MouseListener {
    MyApplication() {
        Mouse.subscribe(this);
    }

    @Override onLeftClick() {
        // do something
    }

    void close() {
        Mouse.unsubscribe(this);
    }
}

当然,这本身只是将检测鼠标点击的问题从应用程序转移到了操作系统。操作系统可能仍然有一个专用的点击观察线程(这已经比每个应用程序的点击观察线程更加资源友好)。但是操作系统可以反过来使用观察者模式,通过为hardware interrupt 安装一个事件监听器,将监听点击委托给实际硬件。使用该解决方案,通过鼠标本身的简单电路来监视点击,它可以非常高保真地检测鼠标点击,而不会占用 CPU 进行不必要的繁忙工作。

简而言之,像可靠地检测鼠标点击这样基本的事情不会以我们习惯的可靠性和效率来完成,如果不是因为洞察到通知事件比不断检查是否更方便我们自己发生了一件事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-20
    • 2023-04-10
    • 1970-01-01
    • 2012-07-22
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多