观察者模式的重点是什么?

时间:2015-06-22 22:06:57

标签: java design-patterns

我目前正在学习Java,它非常有趣,但有些东西真的让我感到困惑。我理解如何使用观察者模式,但我找不到任何真正的用途。我显然已经看到了一些例子,但我发现它会使代码更复杂,并且有更简单的方法来做这些事情。

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

由于

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

为了一个好的和简单的例子,让我们假设操作系统是用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,阻止我们的线程运行),应用程序可能不会注意到点击。 / p>

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

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

    @Override onLeftClick() {
        // do something
    }

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

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

简而言之,基于可靠地检测鼠标点击的基本功能无法通过我们习以为常的可靠性和效率来实现,如果不是因为洞察力而不是经常检查事件是否更方便被通知事件。我们自己发生了一件事。