Wrapper 类 在 Java 中使用的设计模式?

Design pattern that Wrapper Classes use in Java?

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

Wrapper Class 是否真的使用任何设计模式?

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

如果你指的是包装原语

Wrapper classes provide a way to use primitive types as objects

Adapter模式是最准确的意思:

A decorator makes it possible to add or alter behavior of an interface at run-time. Alternatively, the adapter can be used when the wrapper must respect a particular interface and must support polymorphic behavior, and the Facade when an easier or simpler interface to an underlying object is desired

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

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

  • 装饰器模式。包装一个组件并可能 装饰 它带有一些额外的 特征 .
  • 适配器模式。简单包装一个组件,为消费者提供合适的接口。
  • 门面模式。包装组件以方便使用其他复杂的外部接口。

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

适配器 将class 的接口转换为另一个接口。基元不实现任何接口。

Decorator 将 class 的行为添加到实现一个接口的行为中,方法是将其包装在实现相同接口的另一个接口中。基元不实现任何接口。

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


除此之外,还有一些他们确实使用的设计模式:

IntegerLongByte 使用 object pool of flyweight objects, to avoid creating unnecessary instances.

Boolean 有点 试图成为一个 multiton (因为构造函数已被弃用)但实际上它不是。

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

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

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

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

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

作曲关系中有两个基本部分:作曲者和作曲者。您可以将其大致视为 part/whole 关系。它可以是一对一或一对多。 wrapper 是作曲家,即它是整体。它可以包裹一个或多个组成部分。

许多不同的设计模式为了不同的目的利用一般的组合关系。其中许多不同的模式统称为 "wrappers"。 GoF 书中至少提到了两种这样的模式。

  • ADAPTER Also Known As Wrapper page 139
  • DECORATOR Also Known As Wrapper page 175

总而言之,Wrapper 不是任何单一的设计模式;相反,它是一种设计模式。顺便说一下,我们在术语 Factory 中看到了相同的动态。没有名为 Factory 的单一设计模式;相反,它是一种设计模式。