Java CRUD DAO持久性设计

时间:2018-02-18 09:48:08

标签: java design-patterns persistence dao

最近我真的专注于编写干净的代码和实现设计,我偶然发现我有几个选项,但无法确定哪一个是合适的。我正在研究一种需要持久化对象集合的软件。我决定实现DAO模式。问题是持久性可能都是Json OR Xml所以我这样实现了它:

我创建了一个通用DAO:

public interface GenericDao<T> {
    public boolean add(T type);
    public boolean change(T type);
    public void delete(T type);
}

然后我创建了一个CarDAO:

public interface CarDao extends GenericDao<Car> {
    public Car getByIdentificationNumber(int id);
    public void process();
}

对于JSON持久性:

JsonGenericDao:

public class JsonGenericDao<T> implements GenericDao<T>  {

    public boolean add(T type) {
        // implement ADD for json
    }
    public boolean change(T type) {
        // implement Change for json
    }

    public void delete(T type) {
        // implement Delete for json
    }
}

JsonCarDao:

public class JsonCarDao extends JsonGenericDao<Task> implements CarDao {

    public Car getByIdentificationNumber(int id) {
        // Implement logic
    }

    public void process() {
        // Logic
    }
}

JsonCarDao扩展JsonGenericDao以包含添加,更改,删除,它还​​提供其他方法。

实施XmlGenericDaoXmlCarDao的方式相同。

所以我最终可能会使用XmlCarDao OR JsonCarDao,具体取决于我想要使用的持久性。

实现持久性时,我使用JAXB表示XML,Gson表示JSON。 我创建了一个EntityCollection<T>类来存储对象,我将这个集合转换为XML或JSON,具体取决于使用的持久性,我会从文件中检索信息到这个集合,更改需要更改的内容和然后重写文件。

我可以通过两种方式实现它:

选项1:

我可以使用Gson内的JsonGenericDao来实现持久性,并对JAXB内的XmlGenericDao执行相同操作。

选项2:

我可以创建一个接口Persister<T>并编写两个实现此接口的类,因此JsonPersister<T>XmlPersister<T>使用update(T type)acquireAllFromFile()等方法,其中一个将使用新数据重写整个文件,另一个将从文件中检索信息。 (可以在选项1中完成同样的事情但不进行额外的类)

然后在JsonGenericDao<T>内我可以使用:JsonPersister<EntityCollection<T>>XmlGenericDao<T>里面我可以使用:XmlPersister<EntityCollection<T>> 因此包装一切。

这里的问题是考虑到这一点,这意味着我可以摆脱JsonGenericDaoXmlGenericDao并实现一个PersistenceGenericDao,它将使用{{1}在其CONSTRUCTOR内部接口,以指定是否应使用Persister或应使用JsonPersister它基本上是XmlPersisterDAO的组合。现在这似乎是我可以做的事情......但在我看来它也会让我最初的DAO设计变得混乱。这是适当的做法还是不好的做法?

1 个答案:

答案 0 :(得分:1)

我认为您的选项2实际上看起来像GoF Bridge PatternXmlPersister / JsonPersisterConcreteImplementorPersistenceGenericDaoAbstractionJsonCarDaoRefinedAbstraction

所以这个想法实际上是有道理的。请参阅What problems can the Bridge design pattern solve?以确定您是否确实需要该模式。

如果您只打算使用XML或JSON持久性,我个人会选择选项2.如果您将JsonCarDaoXmlCarDao进行比较,它们之间的唯一区别可能是保存/的机制从某些资源加载数据(JSON与XML)。其余逻辑可能几乎相同。从这个角度来看,提取&#34;保存/加载&#34;是合理的。到特定的实现者,并为DAO逻辑的其余部分设置一个泛型类。

但是,如果考虑关系或NoSQL数据库持久性,这可能不适合。因为DAO逻辑可能会有所不同。与JSON DAO(从JSON文件加载数据并搜索具有给定ID的对象的对象集合)相比,类似findById的方法在关系DAO(DB中的查询)中会有很大差异。在这种情况下,RelationalPersistence可能效率不高。