Objective-C,作为适配器模式的代表:谁是受让人?

问题描述 投票:4回答:4

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

ios objective-c cocoa design-patterns delegates
4个回答
6
投票

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

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

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

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

Interface Builder(IB)包括一个称为“用户定义的运行时属性”的功能,可让您使用键值编码(KVC)在自定义接口对象上设置属性。它使您可以指定数量有限的数据类型(int,float,bool,points,rects,UIColors以及其他几种)。您可以使用“用户定义的运行时属性”来设置视图图层的边框宽度和拐角半径,并且应该能够使用它来更改图层的边框颜色或背景颜色。但是,图层颜色指定为CGColors,而UIViews使用UIColors。由于IB仅在用户定义的运行时属性中接受UIColors,所以它不起作用。

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

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


4
投票

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

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

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



-2
投票

DELEGATE对象是适配器,因为:

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

© www.soinside.com 2019 - 2024. All rights reserved.