【问题标题】:Is there a solution to allow implementation of an abstraction layer using generics over several similar types with different interfaces?是否有解决方案允许在具有不同接口的几种相似类型上使用泛型实现抽象层?
【发布时间】:2015-03-24 09:29:01
【问题描述】:

假设您有多个类型,每个类型代表一个字段集合。 每种类型的字段不同,但有些类型共享一些字段。

让我们考虑一下冰淇淋类型。所有 IceCream 类型都实现了一个公共接口,该接口要求公开一个方法 getFlavor()。但是,每种 IceCream 类型还公开了其他几种方法。 IceCream 类型包括 Gelato、WaterIce、FrozenCustard、ChilledCream 和 Traditional

某些 IceCream 类型公开了获取制造商的方法,但其他 IceCream 类型没有制造商,因此不公开获取制造商的方法。

此外,IceCream 类型不会以相同的方式公开 getManufacturer() 方法 - 有些人称之为 getManufacturer(),而另一些人称之为 getMaker()、getChef() 或 getOwner()。此外,单个 IceCream 类型可能有多个单独的方法,每个方法返回相同(或不同)的制造商。

给定一组 IceCream 类型,其中一些具有返回制造商的方法(制造商将始终是相同的数据类型)如何抽象这些 IceCream 类型,以便他们可以编写通用逻辑来处理 IceCream 类型复制用于分别检索每种 IceCream 类型的制造商的所有代码?

很遗憾,这些类无法修改。

这似乎需要某种类型的枚举,其中包含从 Type -> String 的映射,并且 Strings 用于反射性地解析类方法。是否有另一种通用的方法来实现这一点?

【问题讨论】:

  • 我建议你使用装饰器模式。对于每种类型的冰淇淋,您需要创建一个 IceCreamDecorator。装饰器将实现两个接口,即 IIceCream 和 IIceCreamManufactor,并将冰淇淋作为内部类传递。 IIceCreamManufactor 有一个方法是 getManufactor,因此它将封装内部类的 getMaker()、getChef() 或 getOwner()。这样您就不会更改现有代码,并且可以随意扩展装饰器。
  • 如果你喜欢它..我可以用它创建一个新答案并将其标记为答案吗?:P只是想得到一些积分!
  • 当然!我认为这是一个不错的答案 - 使用装饰器来包含损坏的抽象

标签: java oop design-patterns abstraction


【解决方案1】:

我建议你使用装饰器模式。对于每种类型的冰淇淋,您需要创建一个IceCreamDecorator。装饰器将实现IIceCreamIIceCreamManufactor 两个接口,您将icecream 作为内部类传递。 IIceCreamManufactor 有一个方法是getManufactor,因此它将封装内部类的getMaker()getChef()getOwner()。这样您就不会更改现有代码,并且可以随意扩展装饰器。

【讨论】:

    【解决方案2】:

    如果您可以更改现有的 IceCream 类型,您可以引入一个新界面。

    由于这是不可能的,下一个最佳选择是为每个“字段”设置一个专用类;就像一个班级ManufactorerRetriever。例如,这个类知道不同的 IceCream 类型 - 以及如何检索不同类型的实际制造商。这使您至少可以将所有这些丑陋的“instanceof”调用包含在一个中心位置。

    【讨论】:

    • 如果我们需要根据其制造商对 IceCream 做其他非通用的事情怎么办?我们是否只是在 IceCream 功能的某些组件上构建了额外的横切抽象类?
    【解决方案3】:

    您可以在 Java 8 的接口中设置默认实现,因此如果没有制造商则不需要实现它。或者,您可以使用实现一些基本方法的基本抽象类,它可以包含一些基本接口实现,这些实现需要实现。很难为这种抽象找到一个好的解决方案,因为未来一切都可能发生变化。

    【讨论】:

    • 无法更改现有类型。
    猜你喜欢
    • 1970-01-01
    • 2018-01-01
    • 2020-05-14
    • 1970-01-01
    • 2019-10-16
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多