Цель C - шаблон стратегии? - PullRequest
       15

Цель C - шаблон стратегии?

4 голосов
/ 26 октября 2010

Я понимаю концепцию «паттерна стратегии», но я все еще немного сбит с толку.

Скажем, у нас есть класс с именем Dog. Dog имеет MovementBehaviour (интерфейс), который может быть MovementBehaviourNormal и MovementBehaviourFast. MovementBehaviourNormal и MovementBehaviourFast оба содержат метод с именем move.

Вопрос: как лучше всего получить доступ к атрибутам собаки из метода move? Это плохая идея передать объект dog MovementBehaviour в качестве делегата?

1 Ответ

6 голосов
/ 26 октября 2010

Как правило, вы не должны получать доступ к свойствам 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 и все же выполнили то, что хотели.

...