2014-04-25 67 views
2

在觀察者設計模式中,我知道我們必須向觀察者註冊主題。但我注意到,在一些實現中,主題實例通過觀察者類發送,然後觀察者的對象被髮送到使用主題實例的主題類。看下面的例子將觀察者與主體耦合

public class Observer1 extends Observer { 

public Observer1(Subject subject) { 
    this.subject = subject; 
    this.subject.attach(this); 
} 

@Override 
public void update() { 
    System.out.println("Observer1: " 
      + Integer.toBinaryString(subject.getState())); 
    } 
} 

我的問題是Observer類是否需要有主題實例?我認爲觀察是完全從主體分離

可能有人給我一個很好的實現Observer設計模式或

+0

在觀察者模式的適當實現中,觀察者和主體是「鬆散耦合」的,而不是「完全分離的」。這個例子顯示強耦合,這意味着它是一個糟糕的實現。 –

回答

2

理論上的觀察並不需要保持可觀察對象的引用(你叫什麼'的任何資源主題「),因爲Observer通常已經接收到Observable對象作爲更新方法的參數。

0

這是觀察者模式的糟糕實現。 Subject(或Observable)應該有一組觀察者,並且不需要了解更多關於它們的知識,而不需要知道如何通知它們狀態的變化。

對Observable狀態的任何更改都可以通過通知機制中的參數傳播;這就是爲什麼Java的Observable在其notifyObservers(Object)方法中有一個額外的參數。

觀察者應該不需要任何超過它的update方法,由notifyObservers調用。請注意,在Java SDK中,update方法被引用爲Observable作爲參數,因此不需要將其作爲Observer的數據成員。