5

「戦略パターン」の概念は理解できましたが、まだ少し混乱しています。

という名前のクラスがあるとしましょうDog。 となることができる(インターフェース)をDog持っています。 どちらにも という名前のメソッドが含まれています。MovementBehaviourMovementBehaviourNormalMovementBehaviourFastMovementBehaviourNormalMovementBehaviourFastmove

質問: メソッドから犬の属性にアクセスする最良の方法は何moveですか? MovementBehaviour犬オブジェクトをデリゲートとして渡すのは悪い考えですか?

4

1 に答える 1

6

通常、ストラテジーオブジェクトから直接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にさらすことを避け、意図したことを達成しました。

于 2010-10-26T03:47:19.480 に答える