我正在尋找一種方式來做到以下幾點:定義實現的抽象對象
項目: 定義當一些事件發生的被稱爲抽象類(事件處理程序,如果你會) 定義引擎將使用以上事件處理程序觸發事件
B項目: 定義抽象類的實現 運行引擎。
如何註冊實現類,並確保在引擎運行時調用該類。
編輯1:通過寄存器我的意思是我必須以某種方式確定哪些是應該呼籲給定的抽象對象
如果對不起這個問題不是太清楚的實施,讓我知道如果你需要更多一些細節
我正在尋找一種方式來做到以下幾點:定義實現的抽象對象
項目: 定義當一些事件發生的被稱爲抽象類(事件處理程序,如果你會) 定義引擎將使用以上事件處理程序觸發事件
B項目: 定義抽象類的實現 運行引擎。
如何註冊實現類,並確保在引擎運行時調用該類。
編輯1:通過寄存器我的意思是我必須以某種方式確定哪些是應該呼籲給定的抽象對象
如果對不起這個問題不是太清楚的實施,讓我知道如果你需要更多一些細節
在運行時,您可以在A項目(具有屬性文件或Java系統屬性)中傳遞實現的名稱。 然後你在類路徑中找到這個類,並且用newInstance()
將它實例化爲class.forName()
。
但是,您更喜歡使用像Guice或Spring這樣的框架,這樣可以讓您以乾淨的方式將東西粘合在一起。
是這樣的?
class A implements EventHandlerForB {
...
}
public class B {
private EventHandlerForB eventHandler;
public void registerEventHandler(EventHandlerForB eventHandler) {
this.eventHandler = eventHandler;
}
...
}
public interface EventHandlerForB {
...
}
通過它認爲構造函數可能更好的單播。 – 2009-07-27 14:24:38
這個解決方案確實需要我編寫調用處理程序的類,我不這樣做。使用你的對象,在我的問題類B中將被關閉,類A將是我實現的。 – 2009-07-27 17:35:41
有幾個「模式」試圖解決這個問題。僅使用JDK(6或更高版本)類,您可能需要查看java.util.ServiceLoader
「註冊實施類」是什麼意思? – 2009-07-27 12:04:07
據我瞭解(也許你可以給一些更多的澄清,例如Pesudo代碼),你將不得不實例化實際的B項目實現作爲對A項目抽象類的引用。 – Daff 2009-07-27 12:15:55