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.
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
Et DogStrategy devrait être un protocole, pas une classe réelle? – aryaxt
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