سؤال

هل تقول أن الفئات الهدف - C هي تطبيق نمط تصميم الزائر?

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

المحلول

لا توجد فئات موضوعية-ج ليست تنفيذ نمط الزائر. الفئات لا تملك حقا تطابقا دقيقا في عالم نمط التصميم، لأن تقنية أساليب الحقن في الفئات الموجودة دون فئة فرعية غير ممكنة في معظم اللغات. أود أن أقول أنها أقرب إلى ديكور نمط, ، ولكن عادة ما يتم تنفيذ هذا النمط مع التركيب، أي عن طريق التفاف مثيل الكائن الذي تريد "تعزيز".

نمط الزائر مفيدا لتغليف المنطق في الخوارزمية التي قد يتم تطبيقها على مجموعة متنوعة من الكائنات والمويدات وما إلى ذلك على سبيل المثال، إذا كنت ترغب في إنشاء إخراج HTML للحصول على الرسم البياني للكائنات، فيمكنك (أ) اكتب htmlString الطريقة في كل كائن واتصل بها لكل كائن، أو (B) استخدام نمط الزائر وخلق زائر ملموس يعرف كيفية إنتاج إخراج HTML لكل عقدة يزورها.

النهج السابق هو أكثر عام، وينتشر المنطق المهمة ر في قطع صغيرة عبر الفصول الدراسية X و Y و Z. يضع النهج الأخير جميع التعليمات البرمجية ذات الصلة في كائن زائر واحد، والذي يميل إلى تبسيط الصيانة ومنع "I نسيت مشكلة واحدة ... "مشكلة. ومع ذلك، فإن نمط الزائر يتم القول إلى حد ما بالنسبة إلى حد ما بالنسبة لحالات بسيطة - حيث يدفع حقا هو عندما يكون لديك العديد من الوظائف الموازية المختلفة وترغب في مجردة المنطق من الفئات التي يتم تنفيذ الوظيفة عليها. على سبيل المثال، قد تقوم بتنفيذ زوار آخرين يقومون بإنتاج PDF أو إخراج RTF، وما إلى ذلك. يمكن لكل زائر العناية بالعودية ووصل بطرق الزيارة الخاصة به بالترتيب الضروري، ويمكن للزائرين المنفصلين استخدام طلب واضح تماما.

تجدر الإشارة إلى أنه في العديد من اللغات، يستخدم نمط الزائر طريقة التحميل الزائد (نفس الاسم، توقيع / حجج مختلفة). نظرا لأن الهدف - C لا يسمح بالتحميل الزائد للطريقة، فيجب عليك استخدام أسماء أسلوب متميزة، ولكن هذا يمكن أن يساعد بالفعل في تجنب الأخطاء الناجمة عن عدم معرفة التحميل الزائد الذي يتم فيه استدعاء التحميل الزائد.

نصائح أخرى

يمكن استخدام الفئات لتنفيذ نمط الزائر.

@protocol Visit
- (void)acceptVisitor:(MyVisitor *)visitor;
@end

@interface Foo (Visit) <Visit>
@end

@interface Bar (Visit) <Visit>
@end

@implementation MyVisitor

- (void)visit:(id)someObject {
    if ([someObject conformsToProtocol:@protocol(Visit)]) {
        [(id<Visit>)someObject acceptVisitor:self];
    }
}

- (void)visitFoo:(Foo *)foo { ... }

- (void)visitBar:(Bar *)bar { ... }

@end

@implementation Foo (Visit)
- (void)acceptVisitor:(MyVisitor *)visitor {
    [visitor visitFoo:self];
} 
@end

@implementation Bar (Visit)
- (void)acceptVisitor:(MyVisitor *)visitor {
    [visitor visitBar:Self];
}
@end

هذا هو IMO Neater من تصميم الزوار GOF الكلاسيكي، حيث لا يوجد تلوث بين الواجهات العامة للفصول الدراسية التي تمت زيارتها، ويمكن تغليف كل شيء كله في وحدة تجميع فئة الزوار.

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