Objective C - modello di strategia?
-
26-09-2019 - |
Domanda
ho capito il concetto di "modello di strategia", ma io sono ancora un po 'confuso.
Let'say abbiamo una classe denominata Dog
.
Dog
ha MovementBehaviour
(interfaccia) che può essere MovementBehaviourNormal
e MovementBehaviourFast
.
MovementBehaviourNormal
e MovementBehaviourFast
entrambi contengono un metodo denominato move
.
Domanda: qual è il modo migliore per accedere agli attributi di cane dal metodo move
?
E 'una cattiva idea di passare l'oggetto cane a MovementBehaviour
come delegato?
Soluzione
In generale, non si dovrebbe essere su come accedere alle proprietà Dog direttamente dal vostro oggetto strategia. Invece, ciò che si può fare è di fornire un metodo mossa che restituisce una nuova posizione in base alla vecchia posizione. Così, per esempio, se si dispone di:
@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
Poi, quando si crea un'istanza di un cane, è possibile assegnare il NormalDogStrategy e call [dog updatePosition]
- the Dog chiederà la sua strategia per la sua posizione aggiornata, e assegnare che alla sua istanza variabile stessa. Hai evitato di esporre i meccanismi interni di Dog al tuo DogStrategy ed ancora realizzato quello che intendeva.