【发布时间】:2019-11-20 21:32:36
【问题描述】:
我正在设计一个程序,它允许您创建具有特征的对象,然后将其添加到数据库中。例如,像这样的出租物业:
public class Property
{
PropertyType type;
int bedrooms;
int bathrooms;
double squareFootage;
boolean furnished;
}
然后,您或其他用户可以根据这些特征在数据库中搜索对象。但这里有一些限制:
所有属性都定义了每个特征之一(您不能将一个特征留空)
您可以按任何一种特征、特征组合或无特征(查看全部)搜索属性。并且您可以为每个特征指定多重性。例如,您可以指定具有 2、3 或 4 间卧室和 2 或 3 间浴室的 HOUSE。从而不限制面积或家具。
这带来了一个问题,因为搜索条件中是否存在特征可能存在也可能不存在,并且可能具有多重性。这是我目前保存搜索条件的解决方案:
public class SearchCriteria
{
ArrayList<PropertyType> type;
ArrayList<int> bedrooms;
ArrayList<int> bathrooms;
ArrayList<double> squareFootage;
ArrayList<boolean> furnished;
}
问题是,当我想向Property 添加另一个特征时,我必须将它添加到这两个类中(可能更多的是在数据库控制器等中),并为每个类添加额外的函数。我可以利用什么设计模式使这段代码更加模块化和抽象?
基本上,一个好的答案是一个解决方案,它允许通过仅更改一个类/文件来添加或删除特征。
简单地使用接口Trait 和覆盖函数getTrait() 是行不通的,因为所有特征的返回类型都不相同。
编辑:我必须实现一个SearchCriteria 类,因为这个程序在客户端/服务器连接上运行,所以SearchCriteria 将被序列化并通过套接字发送,而不是直接发送到数据库。
【问题讨论】:
-
如果您在数据库中拥有所有内容,只需使用查询根据需要返回属性。不要浪费时间编写数据库可以做的代码。
-
人们不想搜索确切的平方英尺。他们搜索“超过 x 平方英尺”(或者可能是“在 x 和 y 平方英尺之间”)。这取决于人们想要如何搜索特征的性质,这不是 1:1 映射。对于“带家具”,它将是“带家具、不带家具或不在乎”——您可以用
java.lang.Boolean表示。 -
是的,但这并不能解决我的问题。在每个类中使
squareFootage成为不同类型的变量/对象会使问题变得更糟。java.lang.Boolean有助于让它更干净一些,但这已经通过让ArrayList<boolean>为空来解决。我的主要问题是特征很容易被添加/删除。
标签: java design-patterns abstraction