【问题标题】:Abstract, interface - when to use what?抽象,接口——什么时候用什么?
【发布时间】:2017-04-15 08:00:29
【问题描述】:

我对 Java 比较陌生——尤其是在接口和抽象类方面(我确实知道如何使用它们),但是在这种情况下,我有点困惑我应该如何设置我的架构。首先,我想说这只是一个有趣的项目 - 但当然主要目标是获得经验:-)。

让我们开始吧!

我有一个很棒的想法,就是创建一个可以买卖物品的网站。我正在考虑使用 Json、jax-rs 和某种数据库(可能以 NoSQL/MsSQL 结尾。

但是,我似乎在创建架构以及如何正确完成架构方面遇到了问题。

所有广告都有一些共同点(它们都应该包含图片、广告文字、价格等)。这不是问题所在。问题是我不知道如何处理某些广告可能存在的所有差异......例如“电子”类别下的广告可能与“衣服”类别下的另一个广告有很多不同的字段。 .

我的意思是..它可能看起来像这样:

衣服 -> 男士 -> 毛衣

电子产品 -> 手机 -> 苹果

电子产品 -> 电视 -> 三星

会怎么处理呢?

想象以下两个广告:

AD1: 文字:我想卖掉我的电视 价格:100美元 TimeCreated:今天(日期时间,随便) 类别:电子产品 子类别:电视 屏幕尺寸:40" 品牌:三星 型号:700UHD

AD2: 文字:我想卖掉我的裤子 价格:10美元 TimeCreated:今天(日期时间,随便) 类别:衣服 子类别:男士 裤子? 品牌:柴油 尺寸:32 长度:40¨ 条件:不好

我真的希望你明白 - 我真的很困惑我应该如何处理这个问题。

感谢您的宝贵时间。

【问题讨论】:

  • 嗯,在您的网站上拥有 Electronics 选项卡和 Phones 选项卡并不要求您为它们提供类或接口,对吗?我想我并没有真正得到你想要的。对于抽象类和接口之间的一般区别,请查看:stackoverflow.com/a/18778220/5221346
  • 您好,感谢您的回答。我将它作为一个 android 应用程序启动。当我创建一个新广告时,它当然应该将其全部保存在数据库中。我的问题是我认为很难(至少当你不知道正确的方向时)处理可以创建的不同类型的广告。关于广告的信息量和类型可能完全不同,具体取决于它是哪个类别..
  • 你让这变得比它需要的更复杂。如果您从鸟瞰图上看,所有产品都有很多共同点:名称、价格、年龄、尺寸、重量。我会简单地以最通用的方式对它们进行建模,并将实际使用的信息(以及输入的格式)放在类别中。不需要专门的类来表示产品。
  • “将实际使用的信息(以及输入的格式)放在类别中”是什么意思?
  • 您是否只需创建一个包含共享字段(例如位置、价格、年龄、adText)的类,然后为其余类别创建单独的类?

标签: java interface architecture abstract-class abstract


【解决方案1】:

在开始您的项目架构之前,您可能需要阅读设计模式。您在此处描述的内容:

问题是我不知道如何处理所有的差异 某些广告可能有...例如“电子产品”类别下的广告 可能与下面的另一个广告有很多不同的字段 类别“衣服”..

Decorator pattern 的主要候选人。

你可以通过抽象类或接口来实现它,但我会给你另一个强大的工具来考虑:Composition

在这种情况下,我可能会考虑实现单一用途的Interfaces,它们要么基于behaviour,要么基于component。例如,每个广告都会有一个价格,对吗?所以,我会创建一个名为PriceableInterface 并让一个类实现它或另一个接口扩展它。在某种程度上,给你的类一些行为或组件。

有很多方法可以实现您的目标,但了解您的设计模式(你知道,针对常见问题的经过测试的解决方案,等等)是一个重要的起点。

【讨论】:

  • 听起来像是一大堆接口却只提供极少的功能?你能举个简单的例子吗?
  • 欢迎您组合常用功能或组件,从而使其不那么突兀。它是针对您的问题(设计模式)的经过测试的解决方案,但您可以根据自己的喜好对其进行调整。
【解决方案2】:

鉴于产品范围确实很大,我不建议您为问题中提到的每个产品类别或品牌创建一个新类别。相反,您可以拥有的只是具有某些标准属性的产品类别,它将包含品牌和产品类别作为属性。虽然品牌、产品类别和其他少数人本身可以是具有附加属性的类,但可以有其他成员来满足产品类本身中的其他标准字段,如产品 ID、名称、价格、图像等。

对于其他非标准属性,您可能会拥有属性名称到值的映射,以确保设计可扩展用于可能具有要建模的新属性的新产品,而无需每次都强制创建新类。

在数据库前端也是如此:您可以为具有通用属性集的产品创建一个表,然后为每个产品类别的其他属性创建扩展表。

我知道它没有很好的细节,但希望有足够的高级想法让你开始。

【讨论】:

  • 您好,感谢您的回答。我不太确定我是否完全理解您的回答。您有一些具有共享属性(例如文本、价格、创建日期、位置)的主类 - 但是然后呢?
猜你喜欢
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 2011-01-20
  • 1970-01-01
  • 2012-01-05
  • 2013-10-19
  • 1970-01-01
  • 2012-12-13
相关资源
最近更新 更多