Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.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
Ios 目标C,作为适配器的代理模式:谁是适配器?_Ios_Objective C_Cocoa_Design Patterns_Delegates - Fatal编程技术网

Ios 目标C,作为适配器的代理模式:谁是适配器?

Ios 目标C,作为适配器的代理模式:谁是适配器?,ios,objective-c,cocoa,design-patterns,delegates,Ios,Objective C,Cocoa,Design Patterns,Delegates,我不止一次读到Cocoa中使用的委托模式是Adaptern模式()的实现。 它们具有相同的意图,即:让两个具有不兼容接口的对象相互工作。 委托对象是适配器,因为它采用客户机所需的协议,需要该协议且对委托具有弱引用的类是客户机(因此,这将是Cocoa框架的一个类)。 我的问题是:谁是被改编者?代理模式没有围绕任何对象,从我所看到的来看,谁是需要调整的对象?我认为这是对Cocoa代理模式的完全错误的看法 需要委托的对象故意不完整。但是,我们没有使用抽象类并通过子类化添加所需的功能,而是通过提供另一个

我不止一次读到Cocoa中使用的委托模式是Adaptern模式()的实现。 它们具有相同的意图,即:让两个具有不兼容接口的对象相互工作。 委托对象是适配器,因为它采用客户机所需的协议,需要该协议且对委托具有弱引用的类是客户机(因此,这将是Cocoa框架的一个类)。
我的问题是:谁是被改编者?代理模式没有围绕任何对象,从我所看到的来看,谁是需要调整的对象?

我认为这是对Cocoa代理模式的完全错误的看法

需要委托的对象故意不完整。但是,我们没有使用抽象类并通过子类化添加所需的功能,而是通过提供另一个对象委托来添加所需的功能


如今,人们将越来越多地从使用委托对象转向通过传递一个或多个块来提供所需的功能

委托对象是适配器,因为:


它使用特殊对象的特殊协议,并将其包装为自身的特殊协议。

委托并不是适配器模式的真正示例。协议可能更接近,但在Objective C中实现适配器模式的最佳方法是创建一个新对象,其中包含要调整的对象,并使用它为客户机服务


类别是实现适配器模式的另一种方式,但它们有一些限制。不能重写类别中现有方法的实现,也不能向具有类别的类添加其他实例变量。但是,您可以使用关联的对象实现属性,也可以添加新的实例方法

您还可以使用多继承来实现提供C++的语言中的适配器模式,但Objto-C不支持多重继承。 下面是一个适配器的简单示例,该适配器使用我在项目中使用的类别:

Interface Builder(IB)包括一个名为“用户定义的运行时属性”的功能,该功能允许您使用键值编码(KVC)在自定义接口对象上设置属性。它允许您指定数量有限的数据类型(int、float、bools、points、rect、UIColors和其他一些数据类型) 可以使用用户定义的运行时属性设置视图图层上的边框宽度和角半径,并且应该能够使用它更改图层的边框颜色或背景颜色。但是,图层颜色指定为CGColors,UIVIEW使用UIColors。由于IB只接受用户定义的运行时属性中的UIColors,因此它不起作用

为了解决这个问题,我创建了一个名为CALayer+setUIColor的CALayer类别。它有两种方法,SetBackOrderUIColor和setBackgroundUIColor。这些方法非常简单。它们将UIColors作为输入,只需将UIColor转换为CGColor并设置图层的边框颜色或背景颜色


您可以在我的github项目中看到该类别的早期版本。

我在官方文档中找到了一个解决方案,因为我怀疑没有adaptee:

你所说的没有任何意义。请重新表述你的答案,因为没有正确地用英语书写。数据源是objective-c中适配器模式的一个例子。委托背后的目的是专门化,而不是子类化。例如,app委托修改应用程序对象的行为,而不需要
UIApplication
子类。委托对象通常实现协议,使它们可以将两个对象放在一起,如表及其数据,但适配器模式实际上是关于主要功能从一个接口转换到另一个接口的类。一个或多个块是指“适配器”模式吗?与Swift中的面向协议类似,“类别是实现适配器模式的另一种方式,”不,这是装饰器。适配器是关于修改现有接口以使其与另一个接口兼容;而Decorator是在不改变给定类型的接口的情况下添加功能。通过ObjC中的类别(以及Swift中的扩展),您可以实现装饰器模式——苹果方式。