gpt4 book ai didi

java - Java中组合爆炸的例子?

转载 作者:行者123 更新时间:2023-11-30 06:41:22 25 4
gpt4 key购买 nike

在《Effective Java》第 18 条中,Bloch 表示接口(interface)可以防止组合爆炸,这种情况在类型系统中使用具有多个属性的抽象类时会发生。

我无法理解到底什么是组合爆炸。

谁能提供一个由于使用抽象类而导致组合爆炸的例子,以及如何使用接口(interface)来防止这个问题?

最佳答案

注意:此答案借用 Software Architecture Design Patterns in Java ,有关组合爆炸的示例,请参阅装饰器模式章节。

假设您有一个 Logger 接口(interface)和三个具体实现:FileLogger、STDOUTLogger、DBLogger。现在假设有 3 种可能的格式可以记录一行:PlainHTMLEncrypted

天真地,人们可以为每种可能的组合创建一个类,总共 3 * 3 = 9:

  1. FileLoggerPlain
  2. FileLoggerHtml
  3. FileLoggerEncrypt
  4. STDOUTLoggerPlain
  5. STDOUTLoggerHtml
  6. STDOUTLoggerEncrypt
  7. DBLoggerPlain
  8. DBLoggerHtml
  9. DBLoggerEncrypt

上面的 9 翻译为 Java 中的 9 种类型。请注意,类的激增导致支持每种组合。您可以创建可重用类型来描述记录器介质(文件、STDOUT、DB)和格式(普通、Html、加密)。请注意,这仅产生 6 种类型。然后,您可以使用像 Decorator 这样的模式将记录器类型包装在格式类型中(例如 EncryptLoggerDecorator 包装 DBLogger 或包装 STDOUTLogger)来动态更改系统的行为,而不是在使用臃肿的类层次结构时静态定义行为。我相信 Joshua Bloch 试图强调的一点是保持层次结构平坦,而 Java 接口(interface)非常适合实现这一目的。

关于java - Java中组合爆炸的例子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44325301/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com