我不止一次地读过Cocoa中使用的委托模式是Adaptern模式(http://en.wikipedia.org/wiki/Adapter_pattern)的实现。 它们共享相同的意图,即:让两个具有不兼容接口的对象相互协作。 委托对象是适配器,因为它采用客户端所需的协议,需要协议并且对委托具有弱引用的类是客户端(因此,这将是Cocoa框架的一个类)。 我的问题是:谁是适应者?委托模式并没有围绕任何对象,从我所看到的,谁是需要调整的对象?
答案 0 :(得分:5)
代理实际上不是适配器模式的示例。协议会更接近,但在Objective C中实现Adapter模式的最佳方法是创建一个新对象,其中包含您要调整的对象并使用它来为客户端提供服务。
类别是实现适配器模式的另一种方式,但它们有一些限制。您无法覆盖类别中现有方法的实现,也无法将其他实例变量添加到具有类别的类中。您所能做的就是添加新的实例方法。但是,这通常就足够了。
您还可以使用多重继承在提供它的C ++语言中实现适配器模式,但Objective-C不支持多重继承。
使用我在项目中使用的类别的适配器的简单示例如下:
Interface Builder(IB)包括一个名为" User Defined Runtime Attributes"这允许您使用键值编码(KVC)在自定义接口对象上设置属性。它允许您指定有限数量的数据类型(整数,浮点数,bool,点,rects,UIColors和其他一些数据类型。) 您可以使用用户定义的运行时属性在视图的图层上设置边框宽度和角半径,并且您应该能够使用它来更改图层的边框颜色或背景颜色。但是,图层颜色指定为CGColors,UIViews使用UIColors。由于IB仅接受用户定义的运行时属性中的UIColors,因此它不起作用。
为了解决这个问题,我创建了一个名为CALayer + setUIColor的CALayer类别。它有2个方法,setBorderUIColor和setBackgroundUIColor。那些方法很简单。它们将UIColors作为输入,只需将UIColor转换为CGColor并设置图层的边框颜色或背景颜色。
您可以在我的github项目KeyframeViewAnimations中看到此类别的早期版本。
答案 1 :(得分:4)
我说这是对Cocoa委托模式的完全错误观点。
需要委托的对象故意不完整。但是,我们不是通过子类化创建抽象类并添加所需的功能,而是通过提供另一个对象(委托)来添加所需的功能。
如今,人们将越来越多地从使用委托对象切换到通过传递一个或多个块来提供所需的功能。
答案 2 :(得分:1)
我在官方文档中找到了解决方案,因为我怀疑没有适配器: https://developer.apple.com/legacy/library/documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaDesignPatterns/CocoaDesignPatterns.html#//apple_ref/doc/uid/TP40002974-CH6-SW5
答案 3 :(得分:-2)
DELEGATE对象是Adapter,因为:
它使用特殊对象的特殊协议并将其包装到自己的特殊协议中。