109

我遇到软件开发人员使用创建其他类或 API 甚至某些代码的包装器的术语,这是经验丰富的软件程序员使用的术语

所以知道它们是什么意思;

例如一个简单的问题;我们有两种类型的数组排序技术,让我们为它创建一个包装器

上面是一个很简单的例子

4

7 回答 7

162

“包装器”这个词被广泛使用。通常它用于描述包含另一个类的实例但不直接公开该实例的类。包装器的主要目的是提供一种“不同”的方式来使用被包装的对象(也许包装器提供了一个更简单的接口,或者添加了一些功能)。

在描述经典设计模式时,也可以使用“包装器”这个词。

包装一个对象以提供一个简化的接口通常被描述为“外观”模式。包装器是外观。

有时您可能有一个适合特定接口的类,但您不能更改它的代码以使其符合该接口。您可以为实现接口的类创建一个包装器,但它将大多数调用定向到被包装的对象。这是“适配器”模式。包装器是适配器。

您描述的实例,您有两个可以使用不同算法进行数组排序的类听起来像“策略”模式,您提供了一种对某个对象执行操作的方法,但用于该操作的算法可能会有所不同,具体取决于根据该对象的结构。

例如,您的一种排序算法可能非常适合长度小于 100 的数组,但性能可能是它的问题。另一种算法可能适用于更大的数组。您可以为支持排序操作但根据数组长度决定使用哪种算法的两种算法创建一个“包装器”。

绝大多数包装器的存在是为了隐藏某种复杂性。

于 2010-07-21T17:28:50.917 回答
98

类比的简单解释:什么是包装?

代码不用来解释。

示例 1:Ipad “包裹” Iphone

ipad有什么iphone没有的功能?

除了屏幕更大之外,它们基本上不是一样的吗?

Ipad“包裹”了iphone:这意味着你在ipad本身内拥有iphone的所有好处,并拥有更大屏幕等的好处。但从根本上说,ipad内部是一部iphone。

那有什么不同呢?唯一不同的是外观:你有一个更大的屏幕,也许你不能在 Ipad 上打电话。

iphone是Ipad里面唯一的东西。 Ipad 从字面上包裹了 Iphone。 除非你不能用 Ipad 打电话,因为打电话的能力还没有

它与“对象”字面意思是一样的。

.............内部有所有相同的好东西,但外观不同。不同的包装。

“包装器可能会暴露与底层对象不同的特征” ......好吧,但这意味着什么?

有时,包装器可能会限制您可以在其中访问的内容。例如,ipad 可能会限制您拨打电话的能力,即使埋在其中的 Iphone 具有这种能力。

示例 2:自动汽车充当手动汽车的包装器

想想自动车和手动车。在幕后,在自动驾驶汽车中,有一些工程机构会自动为您换挡,但从根本上讲,在表面之下,汽车仍然是手动汽车。换句话说,汽车的自动功能“包裹”了汽车的手动功能。如果您想在自动驾驶汽车中自己手动换档 - 您根本做不到。自动挡汽车“没有暴露”换档的能力。但它暴露在手动车上。当然这个类比有点紧张,但我希望你明白我在说什么。

但是包装器的目的是什么?

如果你想简化事情,你会写一个包装类。将所有复杂的位留在包装器内,确保那些复杂的位不会“暴露”。

示例 - 代码中使用的包装器

Pysch:它是 libyaml 的 ruby​​ 包装器,我相信它是用 C 编写的。如果你想使用 libyaml,但使用 ruby​​,你有什么选择?Pysch 允许您使用 Ruby 编写代码,同时获得 libyaml 的所有好处。它“包装”了 libyaml。

.net 包装器:例如,您可以有一个 .net 包装器,它在下面进行 COM 调用。如果您没有包装器,那么您将被迫自己进行这些 COM 调用。幸运的是,使用包装器,您只需调用 .net 包装代码 - 这反过来会进行这些 COM 调用。这应该有望为您简化事情。

于 2016-06-30T22:22:55.140 回答
14

只是你编写了一些易于使用的代码来隐藏代码的复杂性。当您需要从高级语言调用一些低级 API 并且想要隐藏所有“丑陋”的代码时,它特别有用。

编辑:您可以在这两篇 wiki 文章中找到有关它的更多信息:函数

于 2010-07-20T19:45:41.423 回答
5

Wrapper 是为在不更改实际 API 的情况下在内部调用某些 API 而创建的一些代码。

Facebook 发布的Facebook C# SDK就是一个例子。SDK 实际上是一个包装器,因为它只允许您调用其底层平台,而不提供特定的方法和类。另一方面,Facebook Developer Toolkit是其完整的 API。

于 2010-07-20T19:53:24.547 回答
2

“包装器”有很多示例,并且该术语有时可以互换使用。以下是我想到的几个例子:

DLL 包装器

过去,我围绕 .NET DLL 创建了一个 COM 包装器,以便在理解 COM 但不理解 .NET 的旧应用程序中使用 .NET 的高级功能。

对象包装器 (Java)

在Java中,java.lang包中提供了一个类,为八种原始类型提供对象方法。Java 中的所有原始包装类都是不可变的。因此Wrapper,当需要 an 时,类用于表示原始值Object

于 2010-07-20T19:53:26.560 回答
2

包装函数,主要目的是调用第二个函数的函数

于 2014-05-05T11:56:50.163 回答
0

假设您想在代码中添加更多功能,但您无法更改代码。这就是 wrapper 提供帮助的地方。您可以使用包装器在不更改原始代码的情况下获取输出。

于 2018-05-31T08:41:10.570 回答