目标C - 战略模式?

时间:2010-10-26 03:22:43

标签: objective-c delegates strategy-pattern

我理解“战略模式”的概念,但我仍然有点困惑。

我们有一个名为Dog的班级。 DogMovementBehaviour(界面),可以是MovementBehaviourNormalMovementBehaviourFastMovementBehaviourNormalMovementBehaviourFast都包含名为move的方法。

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

1 个答案:

答案 0 :(得分: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
@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并且仍然完成了你想要的目标。