我理解“战略模式”的概念,但我仍然有点困惑。
我们有一个名为Dog
的班级。
Dog
有MovementBehaviour
(界面),可以是MovementBehaviourNormal
和MovementBehaviourFast
。
MovementBehaviourNormal
和MovementBehaviourFast
都包含名为move
的方法。
问题:从move
方法访问dog属性的最佳方法是什么?
将狗对象作为代理传递给MovementBehaviour
是不是一个坏主意?
答案 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并且仍然完成了你想要的目标。