这是一个设计问题,使用Stack Overflow类比更好地解释:
用户可以获得徽章。用户,徽章和获得的徽章存储在数据库中。徽章的逻辑由徽章条件策略运行。我不希望在数据库中存储徽章条件策略,因为它们是复杂的树结构对象。
如何将存储在数据库中的徽章与其徽章条件策略相关联?我只能想到解决方案。例如:为每个徽章创建1个类并使用SINGLE_TABLE继承策略。或者从数据库中获取徽章,然后以编程方式查找并注入正确的徽章条件策略。
感谢您提出更好的设计建议。
答案 0 :(得分: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();
答案 1 :(得分: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;
}
}