目标C - 战略模式?

ary*_*axt 4 delegates objective-c strategy-pattern

我理解"战略模式"的概念,但我仍然有点困惑.

我们有一个名为的班级Dog. DogMovementBehaviour(接口)可以MovementBehaviourNormalMovementBehaviourFast. MovementBehaviourNormal并且MovementBehaviourFast都包含一个名为的方法move.

问题:从move方法中访问dog属性的最佳方法是什么?将狗对象传递MovementBehaviour给委托是不是一个坏主意?

Tim*_*Tim 6

通常,您不应直接从策略对象访问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
Run Code Online (Sandbox Code Playgroud)
@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
Run Code Online (Sandbox Code Playgroud)

然后,当您实例化Dog时,您可以为其分配NormalDogStrategy并调用[dog updatePosition]- Dog将询问其策略的更新位置,并将其分配给其实例变量本身.你已经避免将Dog的内部暴露给你的DogStrategy并且仍然完成了你的预期.