Estaba pensando en usar el decorator pattern para extender la funcionalidad de una clase UIKit. El problema que estoy enfrentando es que a partir de ejemplos que he visto en otros idiomas, el patrón me obliga a duplicar la interfaz del objeto decorado. Así es como me gustaría ver el patrón implementado:Patrón de decorador en Objective-C
// Inheritance used for compile time check only
@interface UIScrollViewDecorator : UIScrollView
{
UIScrollview *decoratedScrollView;
}
- (id)initWithScrollView:(UISCrollView*)scrollView;
@end
@implementation UIScrollViewDecorator
- (id)initWithScrollView:(UISCrollView*)scrollView
{
self = [super init];
if(self != nil)
{
decoratedScrollView = [scrollView retain];
// maybe set up some custom controls on decoratedScrollView
}
}
// all methods for UIScrollView need to be manually passed to the decorated object
// -- this is the problem
- (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated
{
// use "overwritten methods" to mess with the input for the decorated scroll view
// most of the time though I have no need to make any adjustments here; I still need
// to pass all these messages through so that outside users can interact with me just
// like with a real UIScrollView
[decoratedScrollView scrollRectToVisible:rect animated:animated];
}
@end
Entonces, para resumir, el problema es la duplicación del método del objeto decorado, incluso cuando no es necesario que cambie nada allí. ¿Hay alguna manera más sencilla de transmitir esos métodos que no necesito "sobreescribir"? ¿Podría usar algo como un NSProxy para esto?
EDITAR: Esto se ha convertido principalmente en un problema teórico para mí, ya que me di cuenta de que el patrón de decorador no es lo que necesitaba para resolver mi problema real. Sin embargo, dado que puedo volver a usarlo en el futuro, todavía estoy muy interesado en sus respuestas.
Creo que el swizzling es la forma correcta de hacer decoradores en Objective-C. –