2015-06-22 52 views
-4

我目前正在學習Java,這很有趣,但真的讓我感到困擾。我瞭解如何使用觀察者模式,但我找不到任何實際用途。我明顯看到了一些例子,但我發現它會讓代碼更復雜,並且有很多簡單的方法來完成這些工作。觀察者模式的要點是什麼?

因此,如果有人有一個簡單的解釋/例子,其中Observer模式真的會有一個實用程序,我將不勝感激。

感謝

+0

https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller。大多數GUI都是以這種方式構建的。該模式也可以進入其他體系結構,如異步消息傳遞等。 –

+0

請列出您引用的一些「_many simpler ways_」。 – jaco0646

回答

2

你對堆棧溢出發佈提問,我們都收到通知,一個問題已發佈。這是觀察者模式。

+2

我們收到通知嗎?我不知道你,但我必須檢查stackoverflow頁面才能看到這個問題,所以不是訂閱主題,而是主動通知,我實際上必須* poll * stackoverflow獲取更新。這不是觀察者模式。 – meriton

+0

@meriton Web套接字,如果你有他們。 –

+0

我們收到像「thai」這樣的「2個新問題」的通知。它甚至改變了我們瀏覽器的標題欄。然後我們可以提出這些新問題。 默認情況下,它不會加載這些問題,但讓我們知道發佈了新問題。 –

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,阻止我們的線程運行),應用程序可能不會注意到點擊。

這些問題可以整齊地通過使用觀察者模式,用鼠標作爲主體來避免,以及各種應用程序(或窗口),爲聽衆:

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

    @Override onLeftClick() { 
     // do something 
    } 

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

當然,其本身,這僅僅是移動的檢測從應用程序到操作系統的鼠標點擊的問題。操作系統可能仍然有一個專門的點擊看線程(這對於每個應用程序來說都已經比點擊看線程更加資源友好)。但操作系統可以反過來使用觀察者模式,通過安裝hardware interrupt的事件偵聽器,將點擊委派給實際硬件。使用該解決方案,通過鼠標本身的簡單電路即可完成點擊操作,可以以非常高的保真度檢測鼠標點擊,而無需繁忙工作而佔用CPU。

簡而言之,像可靠地檢測鼠標點擊那樣基本的事情不會以我們習以爲常的可靠性和效率來實現,如果不是因爲認識到與經常檢查相比可以更方便地通知事件是否發生了一件事。