【发布时间】:2018-02-18 09:48:08
【问题描述】:
最近我真正专注于编写干净的代码和实现设计,我偶然发现了一种情况,我有多种选择,但无法确定哪一种是合适的。我正在开发一个需要对对象集合进行持久性的软件。我决定实现一个 DAO 模式。问题是持久性可以是 Json 或 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 以包含 Add、Change、Delete,它还提供了其他方法。
XmlGenericDao和XmlCarDao的实现方式相同。
所以我最终可能会使用 XmlCarDao 或 JsonCarDao,具体取决于我想使用的持久性。
在实现持久化时,我对 XML 使用了JAXB,对 JSON 使用了Gson。
我创建了一个EntityCollection<T> 类来将对象存储在其中,我会根据所使用的持久性将此集合转换为 XML 或 JSON,我会将文件中的信息检索到此集合,更改需要更改的内容,然后重写文件。
我可以通过两种方式实现它:
选项 1:
我可以在JsonGenericDao 中使用Gson 来实现持久性,并对XmlGenericDao 中的JAXB 执行相同的操作。
选项 2:
我可以创建一个接口Persister<T>并编写两个实现该接口的类,因此JsonPersister<T>和XmlPersister<T>使用update(T type)和acquireAllFromFile()等方法,其中一个将重写整个文件使用新数据,另一个将从文件中检索信息。 (同样的事情可以在选项 1 中完成,但不需要额外的类)
然后在JsonGenericDao<T> 里面我可以使用:JsonPersister<EntityCollection<T>>
在XmlGenericDao<T> 里面我可以使用:XmlPersister<EntityCollection<T>>
因此打包所有东西。
虽然这里的问题是在考虑这个问题,但这意味着我可以摆脱JsonGenericDao 和XmlGenericDao 并实现一个PersistenceGenericDao,它将在其CONSTRUCTOR 中使用Persister 接口来指定如果应该使用JsonPersister,或者应该使用XmlPersister。 基本上是DAO 和Strategy Pattern 的组合。现在这似乎是我可以做的事情.. 但在我看来,它也弄乱了我最初的 DAO 设计。这是适当的做法还是不好的做法?
【问题讨论】:
标签: java design-patterns persistence dao