处理具有不同多重性的相似对象分组的设计模式?
A design pattern to handle similar groupings of objects with different multiplicities?
我正在设计一个程序,允许您创建具有特征的对象,然后将其添加到数据库中。例如,出租 属性 像这样:
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
添加另一个特征时,我必须将其添加到这两个 classes(并且可能在数据库控制器等中更多)并添加其他功能为它在每个。我可以利用什么设计模式使这段代码更加模块化和抽象?
从本质上讲,一个好的答案是允许通过仅更改一个特征来添加或删除特征的解决方案 class/file。
简单地使用具有覆盖函数getTrait()
的接口Trait
是行不通的,因为return类型在所有特征中都不相同。
编辑:我必须实现 SearchCriteria
class 因为这个程序是 运行 在 client/server 连接上,所以 SearchCriteria
将被序列化并且通过套接字发送,而不是直接发送到数据库。
如果您只有少数特征,并且它们是您的业务模型的基础,那么在添加新特征或想要更改这些特征之一的行为类型。
但是,如果您试图提出一个可以动态处理向对象添加不同类型特征的模型,您可以考虑根本不将特征编码为 class 属性。相反,让您的模型包含一个特征列表,其中每个特征都知道其特征类型。每个 TraitType 都有一个特定的数据形状,以及一个特定的 Criteria 形状。这将使您能够在某处的文件或数据库中定义您的模型,并根据需要更改它,并且只需要在识别新的 TraitType 时更改 code。但这也将是一项巨大的工作量,并且只有在您的业务需要高度可配置性时才值得。
我正在设计一个程序,允许您创建具有特征的对象,然后将其添加到数据库中。例如,出租 属性 像这样:
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
添加另一个特征时,我必须将其添加到这两个 classes(并且可能在数据库控制器等中更多)并添加其他功能为它在每个。我可以利用什么设计模式使这段代码更加模块化和抽象?
从本质上讲,一个好的答案是允许通过仅更改一个特征来添加或删除特征的解决方案 class/file。
简单地使用具有覆盖函数getTrait()
的接口Trait
是行不通的,因为return类型在所有特征中都不相同。
编辑:我必须实现 SearchCriteria
class 因为这个程序是 运行 在 client/server 连接上,所以 SearchCriteria
将被序列化并且通过套接字发送,而不是直接发送到数据库。
如果您只有少数特征,并且它们是您的业务模型的基础,那么在添加新特征或想要更改这些特征之一的行为类型。
但是,如果您试图提出一个可以动态处理向对象添加不同类型特征的模型,您可以考虑根本不将特征编码为 class 属性。相反,让您的模型包含一个特征列表,其中每个特征都知道其特征类型。每个 TraitType 都有一个特定的数据形状,以及一个特定的 Criteria 形状。这将使您能够在某处的文件或数据库中定义您的模型,并根据需要更改它,并且只需要在识别新的 TraitType 时更改 code。但这也将是一项巨大的工作量,并且只有在您的业务需要高度可配置性时才值得。