0

我有下一个问题:
我有一个类的装饰器NSButtonCell,它增加了一些功能。因为它是一个装饰器 - 是NSButtonCell. 我不喜欢创建子类,因为必须将相同的功能动态添加\删除到NSButtonCell. 而且,由于它是一个装饰器,我必须将所有消息转发给被装饰对象,因为某些子类可以有自己的“设置”、行为等。因为NSButtonCell有很多方法,我无法编写代码将所有消息重定向到被装饰对象. 请告诉我,如何将所有收到的消息重定向到装饰对象?

4

2 回答 2

5

圆钉与方孔相遇。

您发现这样做如此困难的原因是因为它是一种用于实现 UI 的非常非标准的模式。forwardInvocation:由or实现的方法转发NSProxy很有用,但几乎从未用于在 UI 上下文中实现装饰器模式。

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

只需使用一个子类并完成它。

但是,仅在您确实需要时才进行子类化。如果提供的 NSButtonCell 可以满足您的所有需求,并且只需对其进行配置,那么请在您的控制器或您用于布局和呈现用户界面的任何机制中配置它。

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

于 2013-08-24T17:01:10.197 回答
1

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

于 2013-08-21T10:06:25.427 回答