سؤال

أفهم مفهوم "نمط الإستراتيجية" ، لكنني ما زلت مرتبكًا بعض الشيء.

دعنا لدينا فصل اسمه Dog. Dog لديها MovementBehaviour (الواجهة) التي يمكن أن تكون MovementBehaviourNormal و MovementBehaviourFast. MovementBehaviourNormal و MovementBehaviourFast كلاهما يحتوي على طريقة مسماة move.

سؤال: ما هي أفضل طريقة للوصول إلى سمات الكلب من move طريقة؟ هل هي فكرة سيئة لتمرير كائن الكلب إلى MovementBehaviour كمندوب؟

هل كانت مفيدة؟

المحلول

بشكل عام ، يجب ألا تصل إلى خصائص الكلب مباشرة من كائن استراتيجيتك. بدلاً من ذلك ، ما يمكنك فعله هو توفير طريقة نقل تُرجع موضعًا جديدًا بناءً على الموضع القديم. لذلك ، على سبيل المثال ، إذا كان لديك:

@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 updatePosition] - سوف يطلب الكلب استراتيجيته لموقفه المحدث ، ويعين ذلك إلى متغير مثيله نفسه. لقد تجنبت تعريض الكلب الداخلي للكلب الخاص بك وما زلت أنجزت ما كنت تنوي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top