I understand the concept of the "strategy pattern" but I am still a little bit confused.
Let'say we have a class named Dog
.
Dog
has MovementBehaviour
(interface) which can be MovementBehaviourNormal
and MovementBehaviourFast
.
MovementBehaviourNormal
and MovementBehaviourFast
both contain a method named move
.
Question: what is the best way to access the dog attributes from the move
method?
Is it a bad idea to pass the dog object to MovementBehaviour
as a delegate?
The goal of the strategy design pattern is to allow the Client to perform the core algorithm, based on the locally-selected Strategy . In so doing, this allows different objects or data to use different strategies, independently of one another.
In Strategy pattern, a class behavior or its algorithm can be changed at run time. This type of design pattern comes under behavior pattern. In Strategy pattern, we create objects which represent various strategies and a context object whose behavior varies as per its strategy object.
Strategy as Pattern Rather than being an intentional choice, a consistent and successful way of doing business can develop into a strategy. For instance, imagine a manager who makes decisions that enhance an already highly responsive customer support process.
Generally, you shouldn't be accessing properties on Dog directly from your strategy object. Instead, what you can do is provide a move method that returns a new position based on the old position. So, for example, if you have:
@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
Then, when you instantiate a Dog, you can assign it the NormalDogStrategy and call [dog updatePosition]
- the Dog will ask its strategy for its updated position, and assign that to its instance variable itself. You've avoided exposing the internals of Dog to your DogStrategy and still accomplished what you intended.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With