设计基于给定属性检索和分类内容的解决方案

时间:2012-03-14 12:54:11

标签: oop design-patterns

这是我面临的设计问题。假设我有一个汽车网站。汽车具有以下属性,具有不同的可能值。

  • 颜色:红色,绿色,蓝色
  • 尺寸:小,大

基于这些属性,我想根据以下标准对年轻人的汽车,中年人的汽车和老年人的汽车进行分类:

  • Cars_young:红色或绿色
  • Cars_middle_age:蓝色和大
  • Cars_elder:蓝色和小

我会将此标准称为目标

我有一个带有列的桌车:id,颜色和大小。

我需要能够:

a)按ID检索汽车时,告诉其目标(如果是年轻人,中年人或老年人)

b)能够查询数据库以了解每个目标的汽车有多少次观看

此外,作为开发人员,我必须以容易更改这些标准的方式实施它。

哪种方法最好?它有设计模式吗?我可以解释一下我想到的两种可能的解决方案,但我真的不喜欢:

1)在数据库表中创建一个名为 target 的新列,因此很容易同时生成 a) b )

缺点:每次crieteria更改我都要更新所有汽车的列目标,而且,我必须更改insertNewCar()函数。

2)在“汽车”课程中实施它。

缺点:每次更改条件时,我都必须更改 b)中的查询以及 a)中“getCarById”中的代码。

3)在SQL中使用TRIGGERS,但我想尽可能避免使用此解决方案

我希望能够在代码中的某个地方定义这个标准,这个定义可以很容易地改变,并且也希望被'Cars'类使用。我正在考虑一些可以在某些Cars方法中注入的'target'的单例或全局对象。

任何人都可以解释一个很好的解决方案或发送有关这个问题的一些帖子或解决它的模式设计的文档?

1 个答案:

答案 0 :(得分:1)

第一眼specification模式可能符合您的期望。 Wikipedia给出了一个很好的解释,它是如何工作的,小传情吼叫:

OverDueSpecification OverDue = new OverDueSpecification();
NoticeSentSpecification NoticeSent = new NoticeSentSpecification();
InCollectionSpecification InCollection = new InCollectionSpecification();

ISpecification SendToCollection = OverDue.And(NoticeSent).And(InCollection.Not());

InvoiceCollection = Service.GetInvoices();

foreach (Invoice currentInvoice in InvoiceCollection) {
    if (SendToCollection.IsSatisfiedBy(currentInvoice))  {
        currentInvoice.SendToCollection();
    }
}

您可以考虑将specification模式与observers结合使用。

还有其他一些想法:

  • 在SQL生成上扩展specification模式,特别是WHERE子句
  • 在数据库中存储标准配置
  • 条件版本控制:存储有关用于分配到与类别本身相关的类别的规则版本的信息