【问题标题】:Design pattern that Wrapper Classes use in Java?包装类在 Java 中使用的设计模式?
【发布时间】:2019-04-18 07:24:24
【问题描述】:

我发现了一个old post,它没有阐明我对包装类使用的设计模式的理解, 此外,在阅读维基百科时,我没有得到任何明确的信息。

包装类是否真的使用任何设计模式?

如果它使用一个模式,那么它是其中的哪个模式:Decorator PatternFacade PatternAdapter Pattern

【问题讨论】:

  • 我的看法是包装类不是模式,它只是包装现有的类。像 Decorator、Facade 和 Adapter 这样的模式经常使用包装类。但这只是我的意见!

标签: design-patterns adapter decorator wrapper facade


【解决方案1】:

包装类使用组合。与流行格言中的组合相同,“优先组合优于继承。”组合不是设计模式;然而,大多数 OO 设计模式使用组合作为其实现的一部分。这是许多人难以区分不同设计模式的原因之一:组合的共同使用使它们在一定程度上看起来都相同。

作曲关系中有两个基本部分:作曲家和作曲家。您通常可以将其视为部分/整体关系。它可以是一对一或一对多。 包装器是作曲家,即它是整体。它可以包裹一个或多个组合部分。

许多不同的设计模式将通用组合关系用于不同的目的。许多这些不同的模式统称为“包装器”。 GoF 书中至少提到了两种这样的模式。

  • ADAPTER Also Known As Wrapper第139页
  • DECORATOR Also Known As Wrapper第175页

总之,Wrapper 不是任何单一的设计模式;相反,它是设计模式的一个类别。顺便说一句,我们看到了与术语 Factory 相同的动态。没有一种名为工厂的设计模式;相反,它是一种设计模式。

【讨论】:

    【解决方案2】:

    嗯,答案似乎表明您可以出于多种原因包装对象,因此可以包装多种模式。所以我会尽量给出一个更笼统的答案。

    Wrapper 基本上是一个对象,其唯一目的是在不修改主对象的情况下提供某些东西(添加功能、简化 API、序列化,......请参阅其他答案),该包装器通常与“主”对象紧密耦合.例如看别人的答案。

    包装器的某些用法的另一种替代方法是继承,但并非适用于所有情况。

    因此,包装器只是做一些事情的一种技术方式。它本身并不是一种模式。

    【讨论】:

      【解决方案3】:

      如果你指的是包装原语

      包装类提供了一种将原始类型用作对象的方法

      Adapter模式是最准确的意思:

      装饰器可以在运行时添加或更改接口的行为。或者,当包装器必须尊重特定接口并且必须支持多态行为时,可以使用适配器;当需要与底层对象的更简单或更简单的接口时,可以使用 Facade

      我们使用 Wrapper 类的能力来使用原始对象作为对象,这意味着添加对多态行为的支持

      【讨论】:

      • 可能值得添加包装器作为适配器的示例 - 例如原始类型的装箱、COM 组件包装器。
      • @just.another.programmer 这个问题已经问过关于原始类型的装箱了,不是吗?
      • 您的适配器模式链接转到装饰器模式
      • @Michael 是的,但它有很好的描述什么时候使用
      • 我在问题中没有看到任何关于原语装箱的明确内容。 OP 只是说“包装类”。
      【解决方案4】:

      他们不遵循您提到的任何设计模式。

      Adapter 将一个类的接口转换为另一个接口。基元不实现任何接口。

      装饰器通过将实现一个接口的类包装在另一个实现相同接口的类中来添加行为。基元不实现任何接口。

      外观的目的是掩盖它所包裹的对象的复杂行为。编程语言中没有比原语更复杂的了。线索就在名字里。如果有的话,包装类与此相反。


      在我这里的顶部,这里有一些他们确实使用的设计模式:

      IntegerLongByte 使用 object poolflyweight 对象,以避免 creating unnecessary instances

      Boolean 有点试图成为multiton(因为不推荐使用构造函数),但实际上并非如此。

      【讨论】:

      【解决方案5】:

      这三种设计模式都以某种方式描述了一个包装器:

      • 装饰图案。包装一个组件并可能用一些额外的特性装饰它。
      • 适配器模式。只需包装一个组件即可为消费者提供合适的接口。
      • 外观图案。包装一个组件以方便使用其他复杂的外部接口。

      【讨论】:

      • 不是装饰者。装饰器将行为隔离到单独的类中,这些类可以独立地添加到“主”组件中。该结构需要包装主要组件,但这不是重点。
      • 不是门面。外观就是更改类的公共 API。这不仅仅是“包装”它。
      • 你查过维基百科:en.wikipedia.org/wiki/Decorator_pattern?。一个基本的测试是查看单词包装的出现。否则你可以阅读 Intent 部分...如果你想在白墙上找到一个黑点,你几乎肯定会,但这次不是 IMO 的重点。
      • 如果你注意到了,我说的是以某种方式,这并不意味着===。这在某种程度上意味着。我认为你的观点是错误的。
      • 装饰器类将原始类型包装为实现细节。主要区别在于它们的目的:扩展或改变行为,而不是接口。这有点像“所有正方形都是矩形,但并非所有矩形都是正方形”。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-23
      相关资源
      最近更新 更多