2010-05-28 72 views
2

對象,這是一個設計問題,以堆棧溢出的比喻更好地解釋:管理戰略與Hibernate + Spring

用戶可以賺取徽章。用戶,徽章和獲得的徽章存儲在數據庫中。徽章的邏輯由徽章條件策略運行。我不希望在數據庫中存儲徽章條件策略,因爲它們是複雜的樹結構對象。

如何將存儲在數據庫中的徽章與其徽章條件策略相關聯?我只能想到解決方法。例如:爲每個徽章創建一個類並使用SINGLE_TABLE繼承策略。或者從數據庫中獲取徽章,然後以編程方式查找並注入正確的徽章條件策略。

感謝您提供更好的設計。

+0

有趣的問題(+1) – 2010-05-29 17:51:45

回答

1

我不明白爲什麼你應該存儲在DB的策略 - 策略是在代碼中大多表示(可能與這反過來,可以將存儲在DB一些配置參數,但是這是一個不同的問題對我來說) 。

OTOH我會繼續徽章和一類的條件策略,免去了您查找的問題。在Java中,一個好的領域模型應該是將徽章表示爲一個枚舉,用一個可覆蓋的方法來確定給定用戶是否已經獲得了該特定徽章。

更新這裏有一個例子:

enum Badge { 
    EPIC() { 
    public boolean isEligible(User user) { 
     // determine whether this user is eligible for the Epic badge 
    } 
    }, 
    CRITIC() { 
    public boolean isEligible(User user) { 
     // determine whether this user is eligible for the Critic badge 
    } 
    }, 
    ... 
    ; 

    public abstract boolean isEligible(User user); 
} 

但如果你真的希望他們分開,然後在例如構造LegendaryBadge你說this.strategy = new LegendaryBadgeConditionStrategy();

+0

感謝彼得。我不想將戰略存儲在數據庫中。我正在做你的建議,但我仍然沒有看到徽章如何在沒有黑客的情況下與其徽章條件相關聯。想象一下,徽章有一個由構造函數或setter設置的BadgeCondition專用字段,但BadgeCondition是暫時的。 – Francois 2010-05-28 16:05:39

+0

@Francois,看我的更新。 – 2010-05-28 16:31:44

+0

@Francois,還有一點需要注意:如果特定徽章的策略可能因外部或內部因素而異,則使用與徽章分開的策略對我來說只會有意義。對於徽章,情況並非如此 - 獲得特定徽章的條件對於任何給定時間點的所有用戶都是相同的。他們可能會隨着時間的推移而改變,但很少,對我而言,在這裏使用策略模式並不完全合理。 – 2010-05-28 19:31:16

1

BadgeType枚舉類型與數據庫中徽章對應的枚舉類型如何?枚舉可以有一個返回正確的策略,每個枚舉值getBadgeConditionStrategy()方法:

public enum BadgeType { 
    SMARTNESS(new SmartnessBadgeConditionStrategy()), 
    WISDOM(new WisdomBadgeConditionStrategy(), 
    ...; 

    private BadgeConditionStrategy badgeConditionStrategy; 
    BadgeType(BadgeConditionStrategy badgeConditionStrategy) { 
      this.badgeConditionStrategy = badgeConditionStrategy; 
    } 

    public getBadgeConditionStrategy() { 
     return badgeConditionStrategy; 
    } 
}