وضع الزوار: تغليف بعض العمليات التي تعمل على كل عنصر في بنية بيانات معينة. يمكن أن تحدد عمليات جديدة تعمل على هذه العناصر دون تغيير بنية البيانات هذه. مخطط هيكل وضع الزوار هو كما يلي:
من الصورة أعلاه ، يمكنك أن ترى أن لديه الشخصيات التالية:
دور الزائر المجردة: يحدد واجهة ويعلن عن عمليات الوصول واحدة أو أكثر.
دور الزائر الملموس: تنفذ الواجهة التي أعلنها الزوار المجردون ، أي عمليات الوصول المختلفة التي أعلنها الزوار المجردون.
العنصر التجريدي (القابل للزيارة) الدور: يعلن عملية قبول ، وقبول كائن الزائر كمعلمة.
دور concretelement: ينفذ عملية القبول المحددة بواسطة العقد التجريدية.
كائن بنية البيانات (ObjectStructure) دور: يمكن أن يعبر جميع العناصر في الهيكل وتوفير واجهة لكائن الزائر للوصول إلى كل عنصر.
رمز المحاكاة كما يلي:
interface visitor {void visit (gladiolus g) ؛ زيارة باطلة (chrysanthemum c) ؛ } . السلسلة العامة tostring () {return s ؛ } زيارة باطلة عامة (gladiolus g) {s = "gladiolus" ؛ } زيارة باطلة عامة (chrysanteumum c) {s = "chrysanteumum" ؛ }} . } زيارة باطلة عامة (chrysanteum c) {system.out.println ("BEE للوصول إلى Chrysanteum") ؛ }} واجهة زهرة {void قبول (زائر V) ؛ } / * * العنصر الخرساني chrysanthemum ينفذ زهرة {public void قبول (زائر v) {v.visit (this) ؛ }}. }}
// هذا هو فئة GOODERATOR FLOWER FLOWERGERERATOR {private static Random Rand = new Random () ؛ Public Static Flower Newflower () {switch (rand.nextint (2)) {افتراضي: الحالة 0: إرجاع new gladiolus () ؛ الحالة 1: إرجاع chrysanthemum الجديد () ؛ }}} اختبار الفئة العامة { / * * أولاً ، احصل على دور زائر محدد على العميل. يتم اجتياز بنية الكائن. استدعاء طريقة القبول لكل عنصر ، وقم بتمرير دور الزائر المحدد في. هذا يكمل العملية بأكملها*/ public static void main (String args []) {list <loyshls> flowers = new ArrayList <Lower> () ؛ لـ (int i = 0 ؛ i <10 ؛ i ++) flowers.add (flowergenerator.newflower ()) ؛ زائر زائر = جديد StringVisitor () ؛ iterator <loysl> iterator = flowers.iterator () ؛ بينما (iterator.hasnext ()) {iterator.next (). قبول (زائر) ؛ system.out.println (زائر) ؛ } system.out.println ("-----------------------") ؛ /** سلوك الوصول الجديد: Beevisitor Bee Access*/ Visitor Visitor2 = New Beevisitor () ؛ لـ (زهرة الزهرة: الزهور) {flower.accept (visitor2) ؛ }}}نتيجة:
Gladiolus chrysanthemum chrysanthemum gladiolus chrysanthemum chrysanthemum chrysanthemum chrysanthemum gladiolus gladiolus ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
يمكن النظر في وضع الزائر إذا:
1. بنية الكائن تحتوي على العديد من كائنات الفئة ، ولديها واجهات مختلفة ، وتريد تنفيذ بعض العمليات التي تعتمد على فئاتها المحددة على هذه الكائنات.
2. تحتاج إلى إجراء العديد من العمليات المختلفة وغير ذات الصلة على الكائنات في بنية الكائن ، وتريد تجنب ترك هذه العمليات "ملوث" فئات هذه الكائنات. يتيح لك الزائر تركيز العمليات ذات الصلة وتحديدها في الفصل.
3. عندما تتم مشاركة بنية الكائن من قبل العديد من التطبيقات ، استخدم وضع الزائر للسماح لكل تطبيق احتواء العمليات التي يجب استخدامها فقط.
4- نادراً ما تتغير الفئات التي تحدد بنية الكائن ، ولكن هناك حاجة إلى عمليات جديدة غالبًا لتحديد هذا الهيكل. يتطلب تغيير فئة بنية الكائن إعادة تعريف الواجهة لجميع الزوار ، والتي يمكن أن تكون تكلفة كبيرة. إذا تغيرت فئة بنية الكائن بشكل متكرر ، فقد يكون من الأفضل تحديد هذه العمليات في هذه الفئات.
يبدو أن هؤلاء الأفراد اقتراحات ، ويجب تحليل القضايا المحددة في المشروع.