2012-01-06 42 views
7

我來自C#中的Java,其中事件是頭等公民,事件處理程序可以是私有方法。我現在正在研究一個Java項目,我當然需要使用Observer模式來實現事件。在Java中實現觀察者模式時避免暴露實現細節?

由於觀察員需要公開其監聽器/處理器回調方法的可觀察類的,似乎這是暴露實施觀察員到其他漠不關心類的細節。我可以將這些方法的訪問權限設置爲包級別,這樣可以將這些實現細節隱藏給我的包的消費者,但它仍然對我有不好的「味道」。

這只是我需要磨牙和裸露或有更好的方法嗎?

回答

9

使用Observer模式,您正在觀察的類不需要公開其實現。通常你的類通知其他類將有其自己的相關接口供其他類實現。

public interface Observer 
{ 
    public void handleSomeEvent(Object someObjectOfImportance); 
} 

public class Observable 
{ 
    public void register(Observer observer); 
} 

任何類都可以實現接口並註冊自己,而不公開任何實現細節。它確實暴露了它實現了一個接口,但是它沒有指定它是如何實現它的。或者,您可以提供匿名實現。

public class SomeObserverImplementation implements Observer 
{ 
    public void handleSomeEvent(Object someObjectOfImportance) 
    { 
     // I can do whatever I want here 
    } 
} 

更新 如果你擔心自己的班級,現在是暴露出一個新的接口有一些方法來解決它。一個是創建一個匿名實現。另一個是你可以擁有一個實現Observable接口的私有內部類。

public class IDontWantOthersToKnowIObserve 
{ 
    private class HiddenObserver implements Observer 
    { 
     public void handleSomeEvent(Object someObjectOfImportance) 
     { 
      ... 
     } 
    } 

    ... in some method ... 
    theObservable.register(myHiddenObserver); 
} 

使用匿名實現:

theObservable.register(new Observer() 
      { 
       public void handleSomeEvent(Object someObjectOfImportance) 
       { 
           // ... 
       } 
      }); 
+0

謝謝!很好的答案! – HolySamosa 2012-01-06 21:49:15

1

在Java中,這是通常不認爲是真正暴露的實現細節,但是,如果你真的想隱藏你的類從其他類功能那麼你需要讓你的類實現不同的接口,每個接口只公開整個類功能的一個子集。如果再保證其他類只能通過一個特定的接口(可能通過工廠)訪問你的類,那麼你有效地隱藏你的實現。

E.g:

public interface Observer<T> 
{ 
    public void notify(T event); 
} 

public interface PublicFace 
{ 
    public void doSomething(); 
} 

public class SomeClass implements Observer<Event>, PublicFace 
{ 
    public void notify(Event event) 
    { 
    // ... 
    } 

    public void doSomething() 
    { 
    // ... 
    } 
} 

public class FaceFactory 
{ 
    public static PublicFace getPublicFaceInstance() 
    { 
    return new SomeClass(); 
    } 
} 
相關問題