什么是为自有实体解耦服务的设计模式?

时间:2017-02-24 06:06:36

标签: java jpa design-patterns service-layer decoupling

我正在寻找一种设计模式或约定来解耦处理拥有实体的服务。我们假设我有一个ThemeService来处理创建主题。首先,ThemeService只为每个用户的UserData保留主题,但需求会发生变化,主题归其他实体所有,例如ThemeCollection。我的问题是,每个ThemeService都与他们所拥有的"紧密耦合。实体是。例如:

public class ThemeService{
    //coupled to UserData
    createTheme(Theme t, UserData u);
    getTheme(String name, UserData u);
    hasTheme(String name, Userdata u); //Theme name unique within a userdata.
    validateTheme(Theme t, UserData u); //unique name per user, valid colors, etc.
}

public class UserDataService{
   ThemeService tService; //component for themes

   getUsername(UserData u);
   addTheme(Theme t, UserData u){ tService.createTheme(t, u); }
   getTheme(String name, UserData u){ tService.getTheme(name, u); }
   hasThemes(String name, UserData u){ tService.hasTheme(name, u); }
}

现在ThemeService与UserData紧密耦合。如果需求发生变化并且主题可以属于另一个实体,例如ThemeCollection,那么我无法重复使用ThemeService中的大部分代码,现在需要更多的ThemeCollection代码:

public class ThemeService{
    //...continued or in another ThemeService class...
    createTheme(Theme t, ThemeCollection c);
    getTheme(String name, ThemeCollection c);
    hasTheme(String name, ThemeCollection c);
    validateTheme(Theme t, ThemeCollection c);
}

public class ThemeCollectionService{
   ThemeService tService;

   getCollectionName(ThemeCollection c);
   addTheme(Theme t, ThemeCollection c){ tService.createTheme(t, c); }
   getTheme(String name, ThemeCollection c){ tService.getTheme(name, c); }
   hasThemes(String name, ThemeCollection c){ tService.hasTheme(name, c); }
}

我很想让它采用一个通用参数来实现类似" Themeable。"但是,这会使实体实现一个接口:

public class ThemeService{
    createTheme(Theme t, Themeable owner);
    getTheme(String name, Themeable owner);
    hasTheme(String name, Themeable owner);
    validateTheme(Theme t, Themeable owner);
}

@Entity
public class UserData implements Themeable{
   getUsername();
   getThemes(); //From Themable
}

@Entity
public class ThemeCollection implements Themeable{
   getUsername();
   getThemes(); //From Themable
}

我没有在Themeable界面中包含创建,获取,验证等,因为我不希望在我的实体类中使用业务逻辑,这应该是一个纯粹的数据结构(具有业务逻辑)根据Robert Martin"清洁代码"以及我试图遵循某些标准,模型很草率。

是否有标准的方式,模式,约定等来解耦?是我或多或少的"好的"还是在生产环境中不受欢迎?我试图摆脱那些完成工作的代码"对于模块化和可重用的代码,所以非常感谢任何帮助和指针。

编辑:"为什么您的服务与两个实体相关联?"

我需要一个地方来拼接'拥有实体和拥有实体在一起。例如,为UserData创建主题:

public void createTheme(Theme t, UserData u){
   entityManager.persist(t);

   if(!hasTheme(t.name(), u){
      u.getThemes().add(t);
      entityManager.merge(u);
   }
}

因此,此功能与UserData以及任何类似的主题所有者"相关联。会有类似的代码。

0 个答案:

没有答案