الهدف C - نمط الاستراتيجية؟
-
26-09-2019 - |
سؤال
أفهم مفهوم "نمط الإستراتيجية" ، لكنني ما زلت مرتبكًا بعض الشيء.
دعنا لدينا فصل اسمه 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]
- سوف يطلب الكلب استراتيجيته لموقفه المحدث ، ويعين ذلك إلى متغير مثيله نفسه. لقد تجنبت تعريض الكلب الداخلي للكلب الخاص بك وما زلت أنجزت ما كنت تنوي.