2011-02-03 40 views
2

這是更多的設計問題。假設你有許多bean A,B,C ....然後你有一個創建bean的表,比如bean。你需要一些告訴這個類顯示那些bean的哪些屬性,什麼名字給列和其他渲染屬性。我不想在每個bean類的類中使用這個接口,所以我想給bean提供一個像TableAdapterProvider這樣的通用接口,這個接口將提供一個類給出渲染類的所有指令。問題是我不能在Java中使接口方法是靜態的。這似乎不是很乾淨的原因很多...例如創建一個空表我必須分配一個bean,然後調用接口方法TableAdapterProvider來檢索「渲染」類。尋找一個好的模式來實現查看適配器的對象,在Java/JSP

我想創建一個像TableAdapterFactory(Class beanClass)的工廠,它可以爲每個bean類返回正確的TableAdapter,而不需要任何時間。無論如何,我必須爲我創建的每個bean更新這個工廠。

另一種解決方案可以使用特殊的命名約定,例如,如果bean名稱是Apple,則AppleTableRenderer將是渲染器。當TableRenderer啓動時,我可以掃描一個包以搜索這個包,這樣就可以自動完成關聯。

你知道更好的模式嗎?你如何看待我的方法?

未來,有沒有一本好書,可以在網絡應用中使用這些食譜?

回答

0

在我看來,任何需要顯示爲HTML表(通過某種TableRenderer)的bean(A,B,C ..)都應該實現一個接口,該接口爲渲染器提供所需的信息。可能的接口方法將獲得列標題和表格數據。也許還有一個表格風格,但這有點主觀。

考慮到這一點,你可能有;

public interface Renderable 
{ 
    public List<String> getHeaders(); 
    public List<List<String>> getData(); 
} 

public class A implements Renderable 
{ 
    private String name; 
    private int age; 

    public List<String> getHeaders() 
    { 
    List<String> headers = new ArrayList<String>(); 
    headers.add("Name"); 
    headers.add("Age"); 
    return list; 
    } 

    public List<List<String>> getData() 
    { 
    List<List<String>> data = new ArrayList<List<String>(); 
    List<String> row = new ArrayList<String>(); 
    row.add(name); 
    row.add(String.valueOf(age)); 
    data.add(row); 
    return data; 
    } 

    //getters and setters 

} 

然後編寫你的TableRenderer是非常簡單的;

public class TableRenderer 
{ 
    public String render(Renderable r) 
    { 
    //draw a HTML table 
    //draw table headers from r.getHeaders() 
    //draw table rows from r.getData() 
    } 
} 

注意,而不是寫一個TableRenderer類,你可能想使用JSTL <c:forEach>語法,這是一個比較標準的方法。

0

你可以使用抽象類。

實施抽象類中選擇的常用方法

實現每個類中的類特定方法。

添加代碼。

生成你需要調用generateTable方法由processBean產生的paremeter表methhod

public abstract class Parent { 
    /** 
    * This method generates table from common input 
    * @param commonTableMaterial 
    * @return 
    */ 
    private String generateTable(String commonTableMaterial){ 
     return commonTableMaterial+"table me"; 
    } 

    /** 
    * This method is class specific - generating needed input to table 
    * @return 
    */ 
    abstract protected String processBean() ; 

} 

public class ChildA extends Parent { 

    private String firstName ; 
    private String lastName ; 
    private String hiddenName ; 

    @Override 
    protected String processBean() { 

     return firstName +lastName ; 
    } 
} 
+0

你不能用延伸覆蓋靜態方法....你能解釋得更好嗎? – gotch4 2011-02-03 10:24:12

+0

@ gotch4增加了代碼。希望它有助於 – 2011-02-03 10:43:52

0

可能的組合。保留工廠,這對你的任務來說是一個很好的模式:爲給定的bean創建正確的渲染器的工廠。

但讓工廠嘗試找到渲染器 - 通過掃描某個包或從配置文件讀取渲染器類名。

如果工廠找不到渲染器,它可以使用默認渲染器,該渲染器僅反映bean類併爲所有字段創建單元格。

相關問題