2012-06-09 55 views
3

有人告訴我「的模式爲構建接受孩子的可變參數,然後數據庫對象的抽象容器暴露了一些孩子的檢查功能,無需重複碼」。必須有一個更好的實現代碼:(

此提示到「count#of children」,「find by identifier」等事情。

爲簡單起見,下面的代碼只有一個來自基本抽象DatabaseObject類型(即名稱)的字段,但真正的代碼有類似「標識符」和一些複雜的元數據查找噱頭。

這個想法當然是有用的我只是看着我開始編碼的東西讓我想吐:如果我繼續沿着這條道路前進,那將會是一個糾纏的科學怪人。任何方式使它成爲體面的Java?任何設計模式參考? (Composite想到...)

前提:要共享的實際功能是有用的,並且實際上適用於任何可能的可嵌套類型(模式有表格,表格有列,有複合索引有子索引等),特別是標識符查找...

...但「必須有更好的方法」。我感覺到裏面的聲音說:「每當你寫這樣的代碼時,都要打在臉上」。

幫助:)

public abstract class DatabaseContainerObject<ChildType extends DatabaseObject> 
    extends DatabaseObject { 
    protected List<ChildType> children; 
    public DatabaseContainerObject(String name, ChildType... children) { 
    super(name); 
    this.children = new ArrayList<ChildType>(children.length); 
    this.children.addAll(Arrays.asList(children)); 
    } 
    protected List<ChildType> getChildren() { 
    return Collections.unmodifiableList(children); 
    } 
    ... count ... 
    ... find ... 
    ... sort ... 
    ... remove ... 
    ... 
} 
+2

是的顯然的情況下綜合。例如。如果你想在組合中搜索某些東西,首先檢查你是否滿足謂詞(然後返回這個或者某個東西),否則調用find來找所有的孩子。 – Voo

回答

0

複合想到速度非常快,但你也應該調查修飾模式。

找到明顯的遞歸,但計數例如在葉子對象上非常有限,在所有類型的節點上都非常相似。

1

想想戰略模式(http://en.wikipedia.org/wiki/Strategy_pattern)。原因:

  1. 解耦數據和數據操作。
  2. 您可以在運行時更改算法(「計數兒童數」,「通過標識符查找」)。

我想,它是這樣的:

public abstract class DatabaseContainerObject<ChildType extends DatabaseObject> 
extends DatabaseObject { 

    protected List<ChildType> children; 

    private DataOperator dataOperator; 

    public Object find(){ 
     return dataOperator.find(children); 
    } 

} 

public interface DataOperator{ 
    public <ChildType extends DatabaseObject> find(List<ChildType> childList); 
} 

public Class GeneralDataOperator extends DataOperator{ 
    public <ChildType> find(List<ChildType> childList){ 
     //implements find; 
    } 
} 

然後,你可以使用依賴注入。

+0

我不太瞭解依賴注入......請問它在這裏如何應用? – Robottinosino

0

與建議Composite模式從項目18(骨幹實現):從有效的Java第二版不想接口到抽象類

  • 與方法定義的iterface(EntityCollection計數()查找()排序()刪除()
  • 抽象類DatabaseContainerObject實現EntityCollection interface
  • Schema,延伸DatabaseContainerObject和實施EntityCollection接口CompositeIndex類。這裏架構CompositeIndex是*元件* S在組合模式

優點是未來類可以擴展DatabaseContainerObject或實現EntityCollection

相關問題