2012-06-08 12 views
7

Ho letto dal libro Patterns cacao design che il pattern decorator è utilizzato in molti Cocoa classi, tra cui NSAttributedString (che non eredita da NSString). I looked at an implementation NSAttributedString.m ed era sopra la mia testa, ma sarei interessato a sapere se qualcuno su SO ha implementato con successo questo modello E sono disposti a condividere.Naive realizzazione del modello decorator in Objective-C

I requisiti sono adattati da this decorator pattern reference e dal momento che non ci sono classi astratte in Objective-C, il Component e Decorator devono essere adeguatamente abbastanza simili alle classi astratte e il loro scopo originale (cioè non credo che possano essere i protocolli , perché devi essere in grado di fare [super operation].

sarei davvero entusiasta di vedere alcune delle vostre implementazioni di decoratore.

risposta

3

ho usato in una delle mia app in cui ho avuto la rappresentazione multipla di una cellula Ho una cella con un bordo e una cella che aveva aggiunto pulsanti e una cella che aveva un'immagine strutturata ho anche bisogno di cambiare loro a un clic di un pulsante

Ecco parte del codice che ho usato

//CustomCell.h 
@interface CustomCell : UIView 

//CustomCell.m 
@implementation CustomCell 

- (void)drawRect:(CGRect)rect 
{ 
    //Draw the normal images on the cell 
} 

@end 

E per cellulare personalizzato con Border

//CellWithBorder.h 
@interface CellWithBorder : CustomCell 
{ 
    CustomCell *aCell; 
} 

//CellWithBorder.m 
@implementation CellWithBorder 

- (void)drawRect:(CGRect)rect 
{ 
    //Draw the border 
    //inset the rect to draw the original cell 
    CGRect insetRect = CGRectInset(rect, 10, 10); 
    [aCell drawRect:insetRect]; 
} 

Ora a mio controller di vista, vorrei fare le seguenti

CustomCell *cell = [[CustomCell alloc] init]; 
CellWithBorder *cellWithBorder = [[CellWithBorder alloc] initWithCell:cell]; 

Se in seguito ho voluto passare ad un'altra cella farei

CellWithTexture *cellWithBorder = [[CellWithTexture alloc] initWithCell:cellWithBorder.cell]; 
+0

@RobNapier Non si tratta di decoratore, un decoratore è una "sottoclasse" che "ha un" riferimento alla superclasse, decoratore anche devono essere conformi alle interfaccia superclasse –

+0

Hai ragione; Stavo leggendo male il codice. –

+0

@RobNapier :), adoro il tuo libro btw –