2012-07-21 62 views
3

我正在尋找一種方法來使庫可替換。例如:我有一個管理多播通信的庫。我在我的主應用程序中使用該庫。我的想法是使用以下接口:如何使庫在java中可替換?

public interface MessageHandler { 
    public void sendMessage(); 
    public Message receiveMessage(); 
} 

現在應該可以更改庫。例如一個管理廣播通信的庫。兩者都在實施相同的界面。

所以在我的主要應用程序,我希望有機會:

MessageHandler mHandler = new MulticastImpl(); 

或者

MessageHandler mHandler = new BroadcastImpl(); 

我的問題是:我在哪裏放置的接口定義?當我把它放到我的主應用程序中時,我無法從庫中看到它(因爲庫不知道主應用程序)。 當我把它放到兩個庫中時,我有兩個不同的MessageHandler-接口(例如com.multicast.MessageHandler和com.broadcast.MessageHandler)

任何想法?

回答

3

這是一個基本的插件系統。你應該做的是:

  1. 把插件API放在獨立的jar中。
  2. 在主應用程序中包含此插件API jar。
  3. 插件實現應該而不是包括插件API(他們只會用它來編譯)。
  4. 爲應用程序啓動時用戶指定插件的「實施」類(作爲配置字符串)
  5. ,使用反射從配置加載實現類。

請注意,有更復雜的方式來加載java中的插件(例如使用java.util.ServiceLoader和/或嵌套類加載器),但這是一個好的開始。

0

您使用庫接口,不要把它們放在兩者上。該庫正在定義用於與之通信的接口。

在您的主應用程序中,您希望使用庫接口進行編程,然後您可以切換到其不同的實現,而無需更改代碼,只需實現即可。

0

有幾種解決方案,但(將接口放在兩個庫中或將接口放在自己的庫中),但您需要爲接口設置一個名稱 ,例如com.messaging.MessageHandler。

0

策略模式可以在這裏幫助。

如果你想要一個庫是可替換的,定義一個策略 ,它封裝了這個庫的功能。

無處不在您的代碼中,只需調用策略,而不是庫。該戰略將選擇哪種方式去選擇。

已經這樣做了,你可以替換策略後封裝 與任何其他策略或庫。

More information on Strategy pattern

0

您可以使用DI這一點。您將通過您最喜愛的DI實施注入實施。

0

這個問題是「回答」,但無論如何,我想給你帶來另一種視角。

你應該看看OSGi和服務模塊化的方式來實現無縫更換相同的業務邏輯的實現。 OSGi強有力地實現了接口和實現的分離,並提供了一個模塊化的體系結構,甚至可以在運行時重新部署'捆綁'。

你可以有一個MulticastMessageHandler「的MessageHandler」作爲服務的實現。

我們有例如具有可切換noSQL和SQL數據存儲作爲後端的數據存儲。應用程序從不通知/不會使用哪一個。

Eclipse有OSGi的秋分,它包含在您的Eclipse開發環境。