使用Hibernate管理Strategy对象&弹簧

时间:2010-05-28 15:50:41

标签: hibernate design-patterns spring strategy-pattern

这是一个设计问题,使用Stack Overflow类比更好地解释:

用户可以获得徽章。用户,徽章和获得的徽章存储在数据库中。徽章的逻辑由徽章条件策略运行。我不希望在数据库中存储徽章条件策略,因为它们是复杂的树结构对象。

如何将存储在数据库中的徽章与其徽章条件策略相关联?我只能想到解决方案。例如:为每个徽章创建1个类并使用SINGLE_TABLE继承策略。或者从数据库中获取徽章,然后以编程方式查找并注入正确的徽章条件策略。

感谢您提出更好的设计建议。

2 个答案:

答案 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;
     }
 }