繁体   English   中英

Objective-C,作为适配器模式的委托:谁是适配器?

[英]Objective-C, Delegate as Adapter Pattern: who is the adaptee?

我不止一次读到 Cocoa 中使用的委托模式是适配器模式 ( http://en.wikipedia.org/wiki/Adapter_pattern ) 的实现。 它们有着相同的意图,那就是:让两个具有不兼容接口的对象相互工作。 委托对象是适配器,因为它采用了客户端所需的协议,需要该协议并且对委托有弱引用的类是客户端(因此,这将是可可框架的一个类)。 我的问题是:谁是适应者? 委托模式不会将自己包裹在任何对象周围,据我所知,需要调整的对象是谁?

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

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

您还可以使用多重继承在提供它的 C++ 等语言中实现适配器模式,但 Objective-C 不支持多重继承。

一个使用我在项目中使用的类别的适配器的简单示例如下:

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

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

你可以在我的 github 项目KeyframeViewAnimations中看到这个类别的早期版本。

我会说这是对 Cocoa 委托模式的完全错误的看法。

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

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

我在官方文档中找到了解决方案,因为我怀疑没有适配者: https ://developer.apple.com/legacy/library/documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaDesignPatterns/CocoaDesignPatterns.html#//apple_ref /doc/uid/TP40002974-CH6-SW5

委托不是装饰器模式的严格实现。 宿主(委托)对象不包装它想要扩展的类的实例; 事实上,这是相反的,因为委托专门处理委托框架类的行为。 除了框架类声明的委托方法外,也没有接口共享。

Cocoa 中的委托也是模板方法模式(Template Method)的一部分。

来源: https ://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaDesignPatterns/CocoaDesignPatterns.html#//apple_ref/doc/uid/TP40002974-CH6-SW19

DELEGATE 对象是 Adapter 因为:

它使用特殊对象的特殊协议并将其包装到自己的特殊协议中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM