我将实现 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 */
}
答案 0 :(得分:1)
您的策略看起来非常像mapper类本身。将映射器和用户对象转换为接口可能是有意义的,然后您的特定实现选择存储它们的方式/位置。如果您的UserMapper类执行许多与存储无关的操作并且尽管存储不同也不需要更改,那么策略方法是有意义的。但是如果你的所有UserMapper类都是存储,那么接口和多个实现会更简单。
答案 1 :(得分:1)
您不需要任何特定的OOP设计模式。您需要的是提供功能的界面。
然后你的不同数据存储应该实现它。然后,您只需要一个策略,为您的程序的工作流程提供预期的实例。
答案 2 :(得分:1)
首先让UserMapper
成为具有多个实现具体类的接口,然后调用UserDao接口。
我要调用实现类User{Mysql|Redis|etc}DAO
。如果你发现它们之间有任何共同的代码,它可以被提取到一个共同的抽象基类中。
此时UserMapper
类的逻辑可以被调用到UserDaoResolver
,它会根据某些输入选择并返回具体实现,或者如果使用某些依赖注入框架(如Spring),则可以委托这个功能。
当前UserMapper
调用者将通过其接口使用DAO实现,并通过上述方法之一获取它。