Как правило, вы не должны получать доступ к свойствам Dog непосредственно из объекта стратегии. Вместо этого вы можете предоставить метод перемещения, который возвращает новую позицию, основанную на старой позиции. Так, например, если у вас есть:
@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
Затем, когда вы создаете экземпляр Dog, вы можете назначить ему NormalDogStrategy и вызвать [dog updatePosition]
- Dog запросит у своей стратегии обновленную позицию и назначит ее самой переменной экземпляра. Вы избежали разоблачения внутренней части Dog вашей DogStrategy и все же выполнили то, что хотели.