模式实现不同的存储策略

时间:2014-06-16 08:13:56

标签: java design-patterns

我将实现 Data Mapper 模式,以将数据存储在不同的存储/数据库中。

实施此概念的最佳OOP模式是什么?

例如,我有User模型类

public class User 
{
  private int id;
  private String name;
  private String surname;

  /* getters, setters and model-level business logic  */
}

和适当的Data Mapper类

public class UserMapper
{
  public User findById(int id)
  {
    // perform query to MySQL, Redis or another DB
  }

  /* other methods */
}

通过创建多个存储策略类然后将它们注入DataMapper类来使用策略模式是一个好主意吗?

 public class UserMySQLStorageStrategy extends UserStorageStrategy
 {
   public User findById(int id)
   {
     // perform query to MySQL
   }
 }

 public class UserRedisStorageStrategy extends UserStorageStrategy
 {
   public User findById(int id)
   {
     // perform query to Redis
   }
 }

public class UserMapper
{
  protected UserStorageStrategy _storageStrategy;

  public UserMapper(UserStorageStrategy storageStrategy)
  {
    this._storageStrategy = storageStrategy;
  }


  public User findById(int id)
  {
    return this._storageStrategy.findById(id);
  }

  /* other methods */
}

3 个答案:

答案 0 :(得分:1)

您的策略看起来非常像mapper类本身。将映射器和用户对象转换为接口可能是有意义的,然后您的特定实现选择存储它们的方式/位置。如果您的UserMapper类执行许多与存储无关的操作并且尽管存储不同也不需要更改,那么策略方法是有意义的。但是如果你的所有UserMapper类都是存储,那么接口和多个实现会更简单。

答案 1 :(得分:1)

您不需要任何特定的OOP设计模式。您需要的是提供功能的界面。

然后你的不同数据存储应该实现它。然后,您只需要一个策略,为您的程序的工作流程提供预期的实例。

答案 2 :(得分:1)

首先让UserMapper成为具有多个实现具体类的接口,然后调用UserDao接口。

我要调用实现类User{Mysql|Redis|etc}DAO。如果你发现它们之间有任何共同的代码,它可以被提取到一个共同的抽象基类中。

此时UserMapper类的逻辑可以被调用到UserDaoResolver,它会根据某些输入选择并返回具体实现,或者如果使用某些依赖注入框架(如Spring),则可以委托这个功能。

当前UserMapper调用者将通过其接口使用DAO实现,并通过上述方法之一获取它。