最近我真的专注于编写干净的代码和实现设计,我偶然发现我有几个选项,但无法确定哪一个是合适的。我正在研究一种需要持久化对象集合的软件。我决定实现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
以包含添加,更改,删除,它还提供其他方法。
实施XmlGenericDao
和XmlCarDao
的方式相同。
所以我最终可能会使用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>>
因此包装一切。
这里的问题是考虑到这一点,这意味着我可以摆脱JsonGenericDao
和XmlGenericDao
并实现一个PersistenceGenericDao
,它将使用{{1}在其CONSTRUCTOR内部接口,以指定是否应使用Persister
或应使用JsonPersister
。 它基本上是XmlPersister
和DAO
的组合。现在这似乎是我可以做的事情......但在我看来它也会让我最初的DAO设计变得混乱。这是适当的做法还是不好的做法?
答案 0 :(得分:1)
我认为您的选项2实际上看起来像GoF Bridge Pattern。 XmlPersister
/ JsonPersister
是ConcreteImplementor
。 PersistenceGenericDao
为Abstraction
,JsonCarDao
为RefinedAbstraction
。
所以这个想法实际上是有道理的。请参阅What problems can the Bridge design pattern solve?以确定您是否确实需要该模式。
如果您只打算使用XML或JSON持久性,我个人会选择选项2.如果您将JsonCarDao
与XmlCarDao
进行比较,它们之间的唯一区别可能是保存/的机制从某些资源加载数据(JSON与XML)。其余逻辑可能几乎相同。从这个角度来看,提取&#34;保存/加载&#34;是合理的。到特定的实现者,并为DAO逻辑的其余部分设置一个泛型类。
但是,如果考虑关系或NoSQL数据库持久性,这可能不适合。因为DAO逻辑可能会有所不同。与JSON DAO(从JSON文件加载数据并搜索具有给定ID的对象的对象集合)相比,类似findById
的方法在关系DAO(DB中的查询)中会有很大差异。在这种情况下,RelationalPersistence
可能效率不高。