Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 什么是包装器类?_Design Patterns_Wrapper - Fatal编程技术网

Design patterns 什么是包装器类?

Design patterns 什么是包装器类?,design-patterns,wrapper,Design Patterns,Wrapper,什么是包装类? 这些类是如何有用的?听起来就是这样:一个类,它将另一个类或API的功能“包装”在一个更简单或只是不同的API中 请参阅:,包装类是一个用于包装另一个类的类,用于在客户端和被包装的原始类之间添加一层间接和抽象。包装类是一个“包装”其他类的类,就像它的名称一样 它的更正式的定义是一个实现。这允许您将一组API修改为更可用、可读的形式。例如,在C#中,如果您想使用本机Windows API,将其封装到符合.NET设计准则的类中会有所帮助。一般来说,封装类是“封装”或“封装”另一个类或组

什么是包装类?

这些类是如何有用的?

听起来就是这样:一个类,它将另一个类或API的功能“包装”在一个更简单或只是不同的API中


请参阅:,包装类是一个用于包装另一个类的类,用于在客户端和被包装的原始类之间添加一层间接和抽象。

包装类是一个“包装”其他类的类,就像它的名称一样


它的更正式的定义是一个实现。这允许您将一组API修改为更可用、可读的形式。例如,在C#中,如果您想使用本机Windows API,将其封装到符合.NET设计准则的类中会有所帮助。

一般来说,封装类是“封装”或“封装”另一个类或组件功能的任何类。通过从底层类或组件的实现中提供一个抽象级别,这些都是有用的;例如,包装COM组件的包装类可以管理调用COM组件的过程,而不必麻烦调用代码。它们还可以通过减少所涉及的接口点的数量来简化底层对象的使用;通常,这使得底层组件的使用更加安全。

一个包装类不一定需要包装另一个类。它可能是一个API类包装功能,例如dll文件

例如,创建一个dll包装类可能非常有用,它负责所有dll初始化和清理,并创建一个类方法来包装从中创建的函数指针,例如
GetProcAddress()


干杯

包装类通常是将对象作为私有属性的类。包装器实现该私有对象的API,因此可以将其作为参数传递给私有对象

假设您有一个集合,并且希望在向其中添加对象时使用某种转换—您编写了一个包含所有集合方法的包装器类。调用add()时,包装器将转换参数,而不仅仅是将它们传递到私有集合中


包装器可以在集合可以使用的任何地方使用,私有对象仍然可以有其他对象引用它并读取它

值得注意的是,在某些环境中,包装类可能做的大部分工作都被方面所取代

编辑:

一般来说,包装器将扩展包装器的功能,而不必关心包装器的实现,否则包装与扩展包装类没有任何区别。一个典型的例子是围绕其他服务接口添加计时信息或日志功能,而不是将其添加到该接口的每个实现中


这就是方面编程的典型示例。在aspect编程中,您没有逐个函数检查接口函数并添加样板文件日志记录,而是定义一个切入点,这是一种方法的正则表达式,然后声明希望在所有与切入点匹配的方法之前、之后或周围执行的方法。可以公平地说,方面编程是装饰器模式的一种使用,包装器类也可以用于装饰器模式,但这两种技术都有其他用途。

有几种设计模式可以称为包装器类


请参阅我对“

Wrapper类是围绕基本数据类型的包装器的回答。它在相应的类实例中表示基本数据类型,例如,布尔数据类型可以表示为布尔类实例。Java中的所有原始包装器类都是不可变的,即一旦为包装器类实例分配了一个值,就不能进一步更改。

包装器类是一个包装另一个类的类,并在客户端和被包装的原始类之间提供抽象。

包装器是一个用于在两个类之间通信的类不同平台之间的不同应用程序

Java编程为每个基本数据类型提供包装类,将基本数据类型转换为对应包装类的对象

包装类提供了一种将基元类型用作对象的方法。对于每个原语,我们都有一个包装器类,例如

int Integer
byte Byte 
Integer和Byte是原始int和Byte的包装类。当您需要将原语用作对象时,有时会有一些限制,因此包装器类提供了一种称为装箱/取消装箱的机制

下面的例子可以很好地理解这个概念

double d = 135.0 d;
Double doubleWrapper = new Double(d);

int integerValue = doubleWrapper.intValue();
byte byteValue = doubleWrapper.byteValue();
string stringValue = doubleWrapper.stringValue();
这就是我们可以使用包装类类型转换成其他基本类型的方法。当您需要将基元类型转换为对象并使用它们获取其他基元时,可以使用这种类型的转换。然而,同样可以通过简单的转换技术实现,因为代码片段可以实现如下

double d = 135.0;
int integerValue = (int) d ;

尽管双精度值被显式转换为整数值,也被称为向下转换。

要使包装类良好运行并非易事。 理解包装器类是如何由其他人设计的也不是一件容易的工作。 因为这是想法,而不是代码。
只有理解了这个概念,才能理解包装器。

包装器类的出现是为了满足程序员的基本需求,即在只允许对象的地方使用原语值。顾名思义,包装器类将原语值包装起来,并将该值保存在对象中。因此,所有不允许使用原语的地方——比如泛型、hashmap键、Arraylists等等——程序员现在可以选择提供这些原语值作为相应的包装器类型

此外,这些包装器类型
int number = 5;
Integer numberWrapped = new Integer(number);
//now you have the int in an object.
//and this is how to access the int value that is being wrapped.
int again = numberWrapped.intValue();