将所有消息转发给其他对象

时间:2013-08-21 09:51:25

标签: objective-c cocoa objective-c-runtime

我有下一期:
我有NSButtonCell类的装饰器,它增加了一些功能。因为它是装饰者 - 是NSButtonCell的子类。我不喜欢创建子类,因为必须动态地将相同的功能添加到NSButtonCell的其他子类中。并且,因为它是一个装饰器,我必须将所有消息转发到装饰对象,因为一些子类可以有自己的'设置',行为等。因为NSButtonCell有很多方法,我不能编写代码来重定向所有消息到装饰对象。请告诉我,如何将所有收到的消息重定向到装饰对象?

2 个答案:

答案 0 :(得分:5)

Round Peg遇见Square Hole。

您之所以难以做到这一点,是因为它是一种非常非标准的模式,用于实现UI。由forwardInvocation:NSProxy实现的方法转发很有用,但几乎从未用于在UI的上下文中实现Decorator模式。

虽然你可以使用NSProxy的子类来选择转发或实现你需要的方法,但与简单地创建子类相比,这完全是浪费代码。

只需使用子类并完成它。

但是,如果你真的需要,只有子类。如果提供的NSButtonCell可以完成您需要的所有操作,而只需配置它,则可以在控制器中配置它,也可以在用于布局和显示用户界面的任何机制中配置它。

在您的情况下,它听起来像是一个中央控制器或UI配置器,因为它将功能集中到一个位置,然后可以控制各种UI类的多个(可能是最小的子类)实例。 / p>

答案 1 :(得分:1)

使用NSProxy是创建对象的标准方法,这些对象充当其他对象或尚不存在的对象的替身。它的整个结构基于处理方法并将它们转发给真实对象。