【问题标题】:A design pattern to handle similar groupings of objects with different multiplicities?处理具有不同多重性的相似对象分组的设计模式?
【发布时间】: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&lt;boolean&gt; 为空来解决。我的主要问题是特征很容易被添加/删除。

标签: java design-patterns abstraction


【解决方案1】:

如果您只有少数几个特征,并且它们是您的业务模型的基础,那么当您添加新特征或想要更改其中一个的行为类型时,必须更改多个类是完全合理的那些特征。

但是,如果您想建立一个模型来处理向对象动态添加不同类型的特征,您可能会考虑根本不将特征编码为类属性。相反,让您的模型包含一个 Trait 列表,其中每个 Trait 都知道其 TraitType。每个 TraitType 都有其数据的特定形状,以及其 Criteria 的特定形状。这将使您能够在某处的文件或数据库中定义您的模型,并根据需要更改它,并且只需要在识别新的 TraitType 时更改代码。但这也是一项巨大的工作,只有在您的业务需求需要高度可配置性时才值得。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2013-05-14
    • 2012-06-27
    相关资源
    最近更新 更多