ios - Objective-C,委托(delegate)为适配器模式 : who is the adaptee?

标签 ios objective-c cocoa design-patterns delegates

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

最佳答案

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

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

您还可以使用多重继承来实现 Adapter 模式,例如 C++ 等提供它的语言,但 Objective-C 不支持多重继承。

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

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

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

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

关于ios - Objective-C,委托(delegate)为适配器模式 : who is the adaptee?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26689850/

相关文章:

objective-c - NSWindow - 显示始终位于当前窗口顶部的新窗口

ios - CoreData 和对象处理的建议

Cocoa - 以编程方式添加菜单项

ios - pngcrush:在 Linux 上解压?

ios - 'CIImage is undeclared type' 奇怪的错误

ios - 调用相同的 UI View Controller

iOS 在 Photoshop 的 UIView 上放置阴影

android - android、wp7、ios 中用于音频流的 xml 解析

cocoa - NSShowAllViews 和 NSShowAllDrawing 是否适用于 Xcode 3、OS X 10.5.6?

objective-c - 如何让插件导入 UTI 类型