3

我想首先说明由于超出此问题范围的原因,无法修改数据库。

话虽如此,问题在于我有 2 个数据库对象(T1、T2),它们具有几乎相同的属性,并且它们共享相同的 UI 代码和业务逻辑。含义取决于 UI 显示 T1 数据或 T2 数据的配置选项。所有用于管理数据的逻辑也是相同的。

我不想要的是让我的应用程序逻辑代码中到处都是instanceof操作符,并且基本上管理 2 组相同的代码。所以我的解决方案是创建一种将 T1 或 T2 作为构造函数的包装类 (TCombo)。所有的 getter 和 setter 都有类似的设计

public String getProp1() {
    if(o instanceof T1) ((T1)o).getProp1();
    else(o instanceof T2) ((T2)o).getProp1();
}

并且基本上也遵循设置器,所以当我设置一个值时,数据库对象被正确设置。这样做让我可以使用一组代码并在整个代码中管理这个 TCombo 类,效果很好。问题是效率很糟糕,而且由于我的应用程序处理大型数据集,因此必须为数据集中的每个项目创建这个 TCombo 类会产生可怕的加载时间。

我的问题是:管理这些类的最佳方法是什么,这样我就不必维护 2 组逻辑代码并且也有速度?

4

2 回答 2

6

这或多或少是接口被设计用来处理的,所以你T用你常用的 getter 和 setter 设置了一个类似的接口,然后拥有T1T2实现它。两者通用的 then 代码可以传递对接口的引用,并调用通用方法,而无需调用instanceof. 这将使您有可能在单个实例的 getter 和 setter 中实现自定义代码(例如,如果您想在set方法中T1而不是在方法中进行验证或其他操作T2等)

另一种选择是拥有一个您的两个 DB 对象都扩展的公共基类,并且该基对象包含它们之间的所有公共字段。然后你只需传递对基类的引用。这具有不必在同一个地方实现相同的 getter 和 setter 的额外好处。

在任何一种情况下,您都需要使用instanceof和 强制转换来访问和 独有的方法T1T2但您应该能够少得多地这样做。

于 2013-04-22T19:02:54.907 回答
4

你应该看看接口,你可以创建一个接口,让 T1 和 T2 实现接口。那么你只需要创建一个 T1 或 T2 实例,你的代码就可以工作了。您还可以查看 liskov 替代原则。

于 2013-04-22T19:02:22.247 回答