2014-10-02 21 views
1

我在學習面向對象的設計模式,但是如果我只有具體的監聽器和主題,就不明白爲什麼這不是觀察者模式。在我的實踐範例中,我創建了一個名爲DmvCounter和Customers(觀察者)的單一主題的DMV辦公場景。在我的主要方法中,客戶的任務是建立他們希望DMV辦公室爲他們完成的任務。它仍然是一個沒有觀察者和主題接口的觀察者模式嗎?這裏有一個我不確定的例子

Customer bob = new Customer("Bob", "Register Vehicle", 201); // number is bob's order 
Customer pat = new Customer("Pat", "Renew License", 202); 
dmvObject.register(bob); 
dmvObject.register(pat); 

dmvObject.handleRequest(200); // nothing happens - no customer for this request number 
dmvObject.handleRequest(202); // prints: "Pat says: Thank you - Renewed License" 

我的問題是以上是僅在2個對象之間的進程間通信。沒有用於觀察者的接口,並且沒有用於主題的接口。主體通知其已完成特定訂單編號的具體客戶列表。並且客戶離開DMV辦公室。這不是觀察者模式嗎?

enter image description here

+0

I在這個問題和問題上努力工作,我想知道爲什麼這被標記爲關閉?爲什麼人們告訴我這不是觀察者模式?這就是爲什麼我問這個問題.. – 2014-10-02 02:38:50

+0

是什麼讓你覺得這不是觀察者模式的例子? – deyur 2014-10-02 02:44:59

+0

我被告知,觀察者模式需要是抽象的。這裏需要有一個觀察者接口,而不是具體的主題和具體的觀察者。 – 2014-10-02 02:46:30

回答

0

這是觀察者模式的一個例子。

在一個典型的Observer實現中,主體維護一個依賴項列表,並通過調用每個依賴項的方法來通知這些依賴項。這就是你所描述的情況。

現在,您可以說這不是觀察者模式的特別有用的實現,因爲Observable對象不僅需要知道觀察它的類型的對象,而且需要知道方法簽名觀察對象。這不是特別可擴展的,因爲DmvCounter不能被Customer以外的任何東西觀察到。

實現接口(如java.util.Observer)的好處是您可以添加各種觀察者而無需更改DmvCounter,並且可以使用單個方法update(Observable o, Object arg)通知所有人。

+0

是的,但他們指的是一個接口。有一個觀察者界面。我被告知沒有界面,這實際上並不是觀察者模式。 – 2014-10-02 02:45:19

+0

這是一個標準的實現細節,但不是該模式的強制部分。讓具體類實現一個接口通常是有意義的,這樣你就可以將觀察者的實現與通知方法分開,並且有一個標準的'notify'方法。你可以說你的例子不是一個特別可擴展的/可重用的實現,但它仍然符合Observer模式的一般要求。 – deyur 2014-10-02 02:49:25

0

設計模式的概念堅持OOP的概念,因此每個設計模式都必須包含儘可能多的OOP概念。在移動到設計模式之前,您必須瞭解OOP的概念,否則會相當困惑。

那麼爲什麼我們需要接口呢?答案是多態。

假設您有另一位客戶,比如說customer2。然後在你的DmvCounter,你必須實現像這樣的customer2所有功能:

public class DmvCounter() { 
    List<Customer> customer = new ArrayList<Customer>(); 
    List<Customer2> customer2 = new ArrayList<Customer2>(); 

    public void register(Customer customer) { 
     //do something 
    } 

    public void register(Customer2 customer2) { 
     //do something 
    } 

現在想象一下,你有100型的客戶,並與每個類型你寄存器做同樣的工作。如果您必須執行100次註冊碼,這將是一項非常耗時且痛苦的任務。所以多態的概念是:無論消費者是什麼類型的消費者,它仍然是消費者,你只需要1個註冊函數。

所以要回答你的問題,是的,它仍然是一種觀察模式。但它不是一種觀察模式,因爲它不符合OOP的要求,這是多態性