2010-02-12 62 views
1

試圖讓我的頭腦如何模擬對象層次結構中默認值的概念。這些默認值應該應用於層次結構中的所有對象,除非對象覆蓋設置。如果設置被覆蓋,那麼它和它的所有孩子都會得到重寫的值,但其他值將從層次結構中拉出。如何模擬對象層次結構中的級聯設置

也許一個例子會有所幫助。考慮一個模擬體育比賽時間表的系統。頂部有一個Sport對象。該對象包含一組聯賽,而聯賽包含一組季節。一個賽季包含一組附表和時間表包含了一組遊戲:

class Sport { 
    private Set<League> leagues; 
} 
class League { 
    private Set<Season> seasons; 
} 
class Season { 
    private Set<Schedule> schedules; 
} 
class Schedule { 
    private Set<Game> games; 
} 
class Game { 
} 

也許有一個默認值對象,有些類似於這樣:

class Defaults { 
    private Set<Venue> venues; 
    private Set<Weekday> weekdays; 
    private int gameDuration; 
    private Set<RefereePositions> requiredRefereePositions; 
} 

所以,對於「一個運動對象足球」將擁有一個默認對象,指定:

venues: ["Field 1","Field 2", "Field 3", "Field 4", "Field 5"} 
weekdays: ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"] 
gameDuration: 90 
requiredRefereePositions: ["Referee","Linesman 1","Linesman 2"] 

然後,聯賽可以覆蓋這些設置,也許是:

venues: ["Field 4","Field 5"] 
weekdays: ["Sat","Sun"] 

季節可以覆蓋設置,如同時間表。也許一定的比賽時間表是針對低級別比賽的,只需要一名裁判。這樣安排可以覆蓋使用默認值:

requiredRefereePositions: ["Referee"] 

所以,這意味着當調度系統運行,並試圖安排此計劃內的遊戲,它會知道,這個遊戲應該不是「字段4」安排或「字段5」,應該是星期六或星期日,應在90分鐘之久,並有一個裁判:

venues: ["Field 4","Field 5"] 
weekdays: ["Sat","Sun"] 
gameDuration: 90 
requiredRefereePositions: ["Referee"] 

什麼是模型這是一個好辦法嗎?是否有現有的設計模式?我一直在努力尋求Google的解決方案,但我很難選擇正確的關鍵字。如果任何人都可以將我指向在線資源或這樣做的例子,我將非常感激!我正在使用Java實現這一點,但會查看任何示例。

我能想到的一種技術就是在瀏覽器中CSS的工作原理。值沿層次結構級聯,每個節點都可以覆蓋更高層的值。這是否是正確的方法?我將如何在Java中建模?我將如何堅持並通過Hibernate查詢它?

我最後關心的是如何處理僅與層次結構中的某組對象相關的默認設置。例如,在CSS中,「width」的值可能對'script'元素沒有意義。在CSS中,該設置可能只是被忽略,但如果我這樣做了,那麼我的Defaults對象將成爲這個大類,其中包含系統中任何對象都可能需要的所有可能設置。 「requiredRefereePositions」對Venue對象意味着什麼?不知道這是否是最好的選擇。

+0

繼承關係如何? – Padmarag 2010-02-12 05:16:47

+0

還有一個受保護的方法getDefaults(),必要時覆蓋。 – Hubert 2010-02-12 05:20:38

+0

您不希望每個Schedule的實例都有不同的類。即 Schedule houseLeagueScheduleNewYork = CreateSchedule(...); Schedule repScheduleSanJose = CreateSchedule(...); 都是時間表,只是不同的默認值(也許)。 默認值將在運行時設置。 至少這就是我的理解。 – tony 2010-02-12 05:29:46

回答

1

如果你看看Properties這個類,我認爲它會爲你提供解決方案或解決方案的策略。

我鼓勵你不是嘗試將缺省值的getter放入對象模型中 - 這違反了關注點分離原則 - 而是將屬性傳遞給構造函數。內建的Properties類很可能會做你正在尋找的東西,並提供你所問的解耦程度。

如果你不喜歡做基於字符串的查找,你可以在你自己的自定義類中使用枚舉或甚至特定的getXXX調用來實現類似的東西。關鍵是該類將在其構造函數中接收委託。

+0

嗯,使用屬性從來沒有發生過我。我不確定我會使用實際的Properties類,但它的設計可能是正常的。我會深入研究它。 – Tauren 2010-02-12 06:16:20

+0

行爲授權是一種非常常見的設計模式。如果可能,將委託作爲接口傳遞給較低級別​​對象的構造函數(而不是委託的實際類) - 這可以防止靜態耦合。 – 2010-02-12 20:34:49