2012-08-14 34 views
2

我試圖讓我的周圍觀察者模式頭,並在概念上 - 我得到它,它似乎是很多東西真的有益?觀察者模式 - 奇數據點與大型集

但是..在所有的例子中,我正在閱讀 - 看起來所有的例子都使用「單一」數據點,而單個類來管理這個數據點,所以當然如果'x'發生變化,通知其他一些(註冊的) class ...

當一個類中有多個方法可能會改變多個數據點時,會做什麼? - 「觀察員」應該註冊一個特定的「方法」 - 或者添加一個'onchange'方法 - 例如,用一些正常的CRUD方法'insert','update' ,'刪除'...這些方法中的每一個'改變'數據。

如果我有2個觀察者 - 一個「日誌記錄」對象,並且一個UI對象綁定到用戶名......顯然,日誌記錄對象會希望知道任何數據更改,而UI對象可能只關心用戶名。

如何處理這些多個數據點 - 您(希望)不會分別編寫代碼來分別更新每個數據點 - 並註冊每個「監視」!那'太荒謬了。

爲了參數的緣故 - 假設用戶的'屬性'是100個數據點 - (第一,中間,最後,dob,用戶名,電子郵件,密碼,lastlogin等等)和「updateUser」只改變最後一次登錄......'通知'是否處理決定不提醒用戶界面的條件邏輯 - 或者提醒用戶界面(因爲它是'用戶'的觀察者 - 而UI對象有一個處理通知的方法,而且它的條件邏輯來決定「lastlogin」不感興趣,它????

回答

3

您沒有註冊您的觀察員每個方法可以歸類你的觀察,例如:。

private Observer[] updateObservers; 
private Observer[] usernameUpdateObservers; 

當觀察者註冊自己時,它必須知道要將自己放入哪個組。然後,您的用戶類將通知相應的組;

public void setUsername(String username) { 
    this.username = username; 
    notify(updateObservers); 
    notify(usernameUpdateObservers); 
    } 

    public void setEmail(String email) { 
    this.email = email; 
    notify(updateObservers); 
    } 

但是,當您觀察對象的每個動作時,代理服務器可能會更合適。我會給你一個小小的java例子(現在有些方法可以動態地在java中執行此操作,但爲了說明這一點,以下是長版本)。

public interface User { 
    void setUsername(String username); 
    void setEmail(String email); 
} 

public class LoggingUserProxy implements User { 
    private User user; 

    public LoggingUserProxy(User user) { this.user = user; } 

    public void setUsername(String username) { 
    user.setUsername(username); 
    log("updated username to " + username); 
    } 

    public void setEmail(String email) { 
    user.setEmail(email); 
    log("updated emailto " + email); 
    } 

現在,當我創建我的用戶,我把它包在代理

User user = new LoggingUserProxy(realUser); 

接口不變,用戶對象是不是所有的通知()調用污染。