代码去重的模式

3

我一直在开发的一个Java项目需要与多个关系型数据库管理系统集成。为了减少处理它们时的代码重复,我们最明显的方法是创建一个类型继承结构,类似于:

               ThirdPartySoftware (superclass)
                      /|\
                     / | \
                 TPS1  2  3

然而,这种方法导致TPS1、TPS2和TPS3的实现非常相似(但并不完全相同!)。如果将所有功能都放入超类中,超类必须意识到每个地方可能会有所不同,这就破坏了子类化所要带给我们的封装性。
我们考虑的一种方法是通过它们共享的特性来表示DB,比如“支持特性X”和“无法执行特性Y”。然而,不太清楚代码最终是否变得更易于维护,因为:
1.许多怪癖只适用于一个DB。
2.我们想不出足够的共享/可比较(基本上是可抽象的)特征,使其具有价值。
有没有其他建议可以减少子类之间的代码重复,也许使用设计模式?

如果没有可以抽象出来的代码,那么你就需要将它写出来。对于可抽象出来的特性,也许混入可以起到作用。 - Fred Foo
Scala在traits方面做得很好。在stackoverflow上,一些人提出了Java中的mixins/traits实现,例如这里这里 - Bruno Grieder
只是一个想法 - 为什么不使用Hibernate或其他ORM框架呢? - Atul
我把问题表述得有点含糊,但我们正在对数据库和底层数据库文件执行管理操作,而不是在其中存储对象,所以遗憾的是,在这种情况下 ORM 无法帮助我们。 - Dan
2个回答

5

桥接模式

看起来很适合你的情况,但无论如何找到API都是你的工作。

也许,org.hibernate.dialect.Dialect会给你一些新的想法。


0

我不是Java专家,但除了超类/抽象类外,您还可以使用接口和依赖注入以及存储库模式。这些模式并不互斥,我经常有接口实现是主类的子类,例如

SqlDataAccess:BaseDataAccess,IDataAccess和TPSDataAccess:SqlDataAccess,ITPSDataAccess


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接