【发布时间】:2013-05-20 21:18:06
【问题描述】:
我一直在从事一个项目,遇到了一个关于如何进行设计(面向对象)的令人费解的问题。我有不同类别的对象,例如,Employee、Groundskeeper、Customer 等具有相同的数据:名称、ID 号等。到目前为止,我已经做了一个单一的接口,@987654324 @,以及每个这些不同的类别extends这个界面。当我尝试检索数据时出现问题。
如果我只想检索其中一个类别的对象,比如Customer,我必须创建一个新方法,getCustomers()。如果我想获得所有员工,我必须创建另一个类似的方法,称为getEmployees()。这对每个类别继续进行。问题是这些方法的实现几乎相同,因为每个类别的数据都是相同的。唯一的区别是每个都只返回一个特定的类别。
有没有更好的方法来做到这一点,我只需要一种方法,我不会重复自己(本着 DRY 的精神)?
注意:这些类别必须分开,因为以后我需要将每个类别放在数据库中自己的表中,因此在某些时候必须分开类别。
可能的解决方案:
我找到了解决此问题的方法,您的建议对找到它有很大帮助(@Adam me)。我没有对每个类别进行单独的方法调用,而是使用了一个泛型方法,其中类别作为泛型参数提供给该方法。此外,类别的类作为数据库表的键提供。
例如,获取特定类别的Person 的签名将是:
public <T extends Person> Queue<T> getPersons (Class<T> key) {...}
如果要调用方法,对于Customer 来说,调用将是:
Queue<Customer> customers = dataStore.<Customer>getPersons(Customer.class);
Class<T> 只是使用了一个键,而在getPersons(...) 方法内部,有一个Map 将类映射到数据库中的一个表(Map<Class<? extends Person>, String>)。因此,当@ 的类提供 987654337@(Customer、Employee 等),在地图上执行查找,然后从与该类关联的数据库表中检索数据。
虽然它与建议的答案不同,但我非常感谢您的回复:他们引导我找到解决方案的正确方向。
【问题讨论】:
-
你称它为接口,但你真正的意思是
Person是abstract class,对吧?关于这些方法,getCustomers()、getEmployees(),它们会在哪里(什么类)? -
您考虑过基于过滤器的搜索吗?
-
是的,没错。我的意思是
Person是一个抽象类,有方法,getName(),getId()等。然后Employee,Customer等扩展这个抽象类。一个不同的类具有getCustomers()等方法,并检索所有客户(比方说从数据库中)。
标签: java database oop design-patterns