2010-02-05 97 views
2

我在數據庫中有5個不同的表。我寫了一個抽象的「Converter.java」類,它從數據庫中取出數據並將其轉換爲「tree.xml」文件。Java中的繼承問題

Tree.xml

<?xml version="1.0" standalone="no"?> 
<tree> 
    <declarations> 
     <attributeDec1 name="name" type="String"/> 
    </declarations> 

    <branch> 
     <attribute name="name" value="process 1"/> 

     <leaf> 
      <attribute name="name" value="process 2"/> 
     </leaf> 

     <leaf> 
      <attribute name="name" value="process 3"/> 
     </leaf> 
    </branch> 
</tree> 

所以你可以猜到,上述tree.xml的結構將保持相同的所有5桌。唯一的區別在於屬性「值」的值。

要獲取該「值」屬性的值,轉換器首先必須查詢數據庫中的這些值。

因此,5個不同的表應該有5個不同的查詢。因此,而不是編碼5個不同的轉換器,我已經作出了singele 「Converter.java」 具有的功能類似於

  • openTree()
  • closeTree()
  • openBranch()
  • closeBranc()
  • openLeaf()
  • closeLeaf()
  • 的addAttribute()

在上述方法之外,我實現了除addAttribute()方法以外的所有方法,因爲它將根據表執行實現。

在那之後,我已經編寫了5個不同的轉換器,每一個表,所有的人都伸出「Converter.java」

我做了一個名爲作爲Converter.java類「查詢」字段。由於這個字段被所有5個轉換器繼承,我已經在這5個轉換器的構造函數中初始化了這個字段。

現在我的問題如下:

問:我沒有信心,我是否正確使用繼承或者應該在上述方法的一些變化?

編輯:

Q2。在Converter.java類中使用「query」字段的方法還有一個。因爲該字段沒有在Converter.java類中初始化,所以我是否在所有5個子轉換器中複製該方法,或者將該方法放在父類中(即Converter.java)

回答

3

我認爲戰略模式在這裏會更合適。您可以創建具有常見行爲的非抽象類Converter,併爲其提供可以執行特定於表的值檢索的ValueSource。然後,您創建一個QueryValueSourceValueSource的子類)以根據指定的查詢檢索值。

爲了得到一個具體的策略,你可以不同的查詢進入的QueryValueSource構造函數,或者它的子類來創建特定於表的來源。

+0

這絕對是要走的路。很多時候,人們試圖將繼承作爲自己的設計模式使用,當它可以工作時,選擇一種與您嘗試做的事情相匹配的設計模式可以在設計,開發,維護以及嘗試時提供重要的價值增加增強功能。 – BestPractices 2010-02-06 13:18:40

1

希望我能理解你的問題正確。如果我這樣做,那麼它聽起來像你直接初始化字段,如「mQuery = foo;」在每個構造函數中?如果是這種情況,那麼最好的形式可能是僅在超類構造函數中初始化它,然後在每個子類構造函數(如「super(foo);」)中調用該超類構造函數。

0

關於問題Q2:你可以做的是使轉換器類的抽象和使用「查詢」屬性,它的方法提供實現。讓Converter子類的構造函數初始化查詢屬性。

關於Q1,我不能完全理解你所提供的上下文中的問題。可能是一些代碼示例會有所幫助。但有了這個,我可以提出的這個有限的理解是你考慮用組合而不是繼承會有幫助嗎?此外,在我看來,Strategy模式可以在這裏使用。