通常、ストラテジーオブジェクトから直接Dogのプロパティにアクセスするべきではありません。代わりに、古い位置に基づいて新しい位置を返すmoveメソッドを提供することができます。したがって、たとえば、次の場合:
@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にさらすことを避け、意図したことを達成しました。