2010-10-26 6 views
4

Je comprends le concept du "pattern strategy" mais je suis encore un peu confus.Objectif C - Modèle de stratégie?

Let'say nous avons une classe nommée Dog. Dog a MovementBehaviour (interface) qui peut être MovementBehaviourNormal et MovementBehaviourFast. MovementBehaviourNormal et MovementBehaviourFast contiennent tous deux une méthode nommée move. Question: quel est le meilleur moyen d'accéder aux attributs du chien à partir de la méthode move? Est-ce une mauvaise idée de passer l'objet chien à MovementBehaviour en tant que délégué?

Répondre

6

Généralement, vous ne devriez pas accéder aux propriétés de Dog directement à partir de votre objet de stratégie. Au lieu de cela, vous pouvez fournir une méthode de déplacement qui renvoie une nouvelle position basée sur l'ancienne position. Ainsi, par exemple, si vous avez:

@interface Dog : NSObject { 
    NSInteger position; 
    DogStrategy * strategy; 
} 
@property(nonatomic, assign) NSInteger position; 
@property(nonatomic, retain) DogStrategy * strategy; 
- (void)updatePosition; 
@end 

@implementation Dog 
@synthesize position, strategy; 

- (void)updatePosition { 
    self.position = [self.strategy getNewPositionFromPosition:self.position]; 
} 
@end
@interface DogStrategy : NSObject { } 
- (NSInteger)getNewPositionFromPosition:(NSInteger)pos; 
@end 

// some parts elided for brevity 

@interface NormalDogStrategy : DogStrategy { } 
@end 

@implementation NormalDogStrategy 
- (NSInteger)getNewPositionFromPosition:(NSInteger)pos { 
    return pos + 2; 
} 
@end

Ensuite, lorsque vous instancier un chien, vous pouvez lui attribuer le NormalDogStrategy et appelez [dog updatePosition] - le chien demandera sa stratégie pour sa position mise à jour, et attribuer cela à sa variable d'instance elle-même. Vous avez évité d'exposer les internes de Dog à votre DogStrategy et avez encore accompli ce que vous vouliez.

+0

merci beaucoup, beaucoup de détails. NormalDogStrategy ne doit pas hériter de DogStrategy mais doit l'utiliser comme une interface: NormalDogStrategy . Corrigez-moi si je me trompe – aryaxt

+0

Et DogStrategy devrait être un protocole, pas une classe réelle? – aryaxt

+0

Si vous utilisez le modèle de stratégie actuel, alors non - puisque NormalDogStrategy est * une sorte de * DogStrategy, pas un objet qui remplit le contrat d'une DogStrategy et fait aussi d'autres choses. Si vous avez fait de DogStrategy un protocole, NormalDogStrategy devrait aussi être un protocole, et vous ne pouvez pas le faire puisque vous devez implémenter des méthodes dans NormalDogStrategy. (C'est là que les classes abstraites seraient utiles dans ObjC, mais nous devons juste vivre sans.) – Tim