2011-04-17 28 views
1

這不是關於what is a classwhat is an object的問題。我應該如何反對模型類藍圖和具體類?

我想確定一個設計模式,以供重用。

我有一個類的藍圖,其中包含一個與字段名稱和該字段的屬性值鍵入的地圖。這個映射值描述了一個特定類的字段。

class FieldDescriptor { 
    public FieldDescriptor(String name, int length, boolean isKey) { 
    .... 
    } 
    ... 
} 

class ConcreteClass { 
    final public static Map<String, FieldDescriptor> fields; 

    static { 
     Map<String, FieldDescriptor> myFields = new HashMap<String, FieldDescriptor>(); 
     myFields.put("PERSON_CODE", new FieldDescriptor("PERSON_CODE", 10, true); 
     myFields.put("FUN_FUN_FUN", new FieldDescriptor("FUN_FUN_FUN", 6, false); 
     myFields.put("JEDI_POWER_RATING", new FieldDescriptor("JEDI_POWER_RATING", 9000, true); 
     fields = Collections.unmodifiableMap(myFields); 
    } 

    private String personCode; 
    private String funFunFun; 
    private String jediPowerRating; 

    public void setPersonCode(String personCode) { 
     this.personCode = transformField(fields.get("PERSON_CODE"), personCode); 
    } 
    ... 
} 

整個reason for the maddness is the transformField call on the setters。這是我爲什麼創建地圖的核心。

但是我想從我的課程中抽象出來,因爲我想以這種方式構建更多的類,並且能夠一般地或通過接口參考map

我強烈地感覺到地圖應該封裝在一個單獨的類中!但是,ConcreteClass的實例將如何發生?

任何人都可以確定一個合適的設計模式?

+0

對不起,如果我的術語不正確。 – JavaRocky 2011-04-17 23:14:31

+0

對字段描述符的小修改:JEDI_POWER_RATING需要超過9000. – BoffinbraiN 2011-04-18 13:50:05

回答

0

我不知道我是否理解你的問題。但如果我的理解是正確的,我可能會利用反射和對象的一個​​實例,而不是引入一個名爲FieldDescriptor的自定義類。然後我又不知道你的完整用例,所以我可能是錯的。

所以這是我的解決方案簡述:

每班必須有一個名爲defaultInstance默認的靜態字段。 defaultInstance的類型與Class本身的類型相同。如果我使用的是像Spring這樣的框架,我將嘗試利用框架回調方法來填充defaultInstance(如果對象的生命週期被管理,那麼我會簡潔一些)。這個想法是有一個外部組件負責爲每個類提供它的defaultInstance。 (動態注入??)。

一旦類需要訪問存儲在默認實例中的值,它可以使用Reflection API或像Apache BeanUtils這樣的包裝來獲取單獨的字段名稱和值。

我看到你有一個叫做isKey的布爾字段。如果您在運行時需要此信息,則可以使用自定義註釋將某些字段指定爲Key並使用isAnnotation Present來實現您的分支邏輯。

所以在調用結束時,您只需要在每個類中都有一個名爲defaultInstance的屬性。有一個組件,負責填充此對象。 (爲了使其可配置,您可以將信息存儲在像sqllite這樣的屬性文件或數據庫中)。如果可以(使其非侵入性)使用動態注入或AOP,並直接使用Apache BeanUtils或Reflection API來獲取信息。 (即使這個邏輯應該被抽象爲一個單獨的組件)。

+0

我很欣賞這種方法。我不喜歡使用註釋來解決這個問題,因爲當有人忘記使用註釋時,這會將錯誤推送到運行時。 – JavaRocky 2011-04-18 01:28:08

+0

對於問題中的含糊不清 - 這是問題簡化的結果。我對這個問題做了一些修改。其實,我在考慮是否應該發佈更復雜的版本,以便給讀者更多的上下文......:| – JavaRocky 2011-04-18 01:31:44

+0

然後,您可以將關鍵信息與defaultInstance創建邏輯一起封裝起來。 – 2011-04-18 01:32:28

0

它看起來像是您希望字段定義的所有額外複雜性的唯一原因是您可以將您的字段與其在數據庫表中關聯的列屬性相關聯。你不應該自己寫這個 - 使用像Spring或Hibernate這樣的持久性框架爲你完成這項工作。它們在內部使用反射,並幫助保持數據傳輸對象(DTO)清潔並易於維護。

相關問題