23 أنماط التصميم الفصل 16: نمط زوار جافا
التعريف: يتضمن بعض العمليات التي تعمل على كل عنصر في بنية بيانات معينة. يمكن أن تحدد عمليات جديدة تعمل على هذه العناصر دون تغيير بنية البيانات.
النوع: نمط سلوكي
مخطط الفصل:
قد يكون وضع الزوار هو الوضع الأكثر تعقيدًا بين الأوضاع السلوكية ، ولكن هذا لا يمكن أن يكون سببًا لعدم إتقانه.
دعونا أولاً نلقي نظرة على مثال بسيط ، الرمز هو كما يلي
الفئة A {public void method1 () {system.out.println ("i am a") ؛ } public void method2 (b b) {B.Showa (this) ؛ }} class b {public void showa (a) {a.method1 () ؛ }}دعونا نلقي نظرة على ما هو الفرق بين الطريقة 1 وطريقة الطريقة 2 في الفئة A. طريقة 1 طريقة بسيطة للغاية ، ما عليك سوى طباعة جملة "أنا" ؛ الطريقة 2 أكثر تعقيدًا قليلاً ، استخدم الفئة B كمعلمة ، واستدعاء طريقة Showa للفئة B.
دعنا نلقي نظرة على طريقة Showa من الفئة B. تستخدم طريقة Showa الفئة A كمعلمة ، ثم تستدعي طريقة Method1 للفئة A. يمكنك أن ترى أن طريقة Method2 هي مجرد استدعاء طريقة Method1 الخاصة بها. يجب أن تكون نتيجة الجري أيضًا "أنا". بعد التحليل ، دعنا ندير هاتين الطريقتين ونرى نتيجة التشغيل:
اختبار الفئة العامة {public static void main (string [] args) {a a = new a () ؛ A.Method1 () ؛ A.Method2 (New B ()) ؛ }}النتيجة الجارية هي:
أنا
أنا
بعد فهم هذا المثال ، سوف تفهم 90 ٪ من نمط الزائر. في المثال ، بالنسبة للفئة A ، فإن الفئة B هي زائر. ومع ذلك ، فإن هذا المثال ليس وضع الزائر بأكمله. على الرغم من أنها بديهية ، إلا أنها ذات قابلية للتوسع. دعنا نتحدث عن التنفيذ العام لوضع الزائر. يمكنك أن ترى من خلال مخطط الفصل أنه في وضع الزائر ، يتم تضمين الأدوار التالية بشكل أساسي:
زائر مجردة: فئة أو واجهة مجردة تعلن عن العناصر التي يمكن للزائر الوصول إليها. على وجه التحديد في البرنامج ، تحدد المعلمات في طريقة الزيارة الكائنات التي يمكن الوصول إليها.
الزائر: قم بتنفيذ الطريقة التي أعلنها الزوار المجردون ، والتي تؤثر على ما يجب على الزائرين فعله وما ينبغي عليهم فعله بعد الوصول إلى الفصل.
فئة العناصر المجردة: واجهة أو فئة مجردة تعلن نوع الوصول إلى الزوار. يتم تعريف البرنامج من خلال المعلمات في طريقة القبول. هناك عمومًا نوعين من الطرق للعناصر المجردة ، أحدهما هو منطق أعماله الخاص ، والآخر هو نوع الزوار المسموح للوصول إليه.
فئة العناصر: تنفذ طريقة القبول المعلنة بواسطة فئة العناصر المجردة ، وعادةً الزوار.
الكائن الهيكلي: تحتوي حاوية العناصر عمومًا على حاوية تستوعب عدة فئات وواجهات مختلفة ، مثل القائمة ، المحددة ، الخريطة ، إلخ. نادراً ما يتم تجريد هذا الدور في المشروع.
تنفيذ الكود الشائع لوضع الزوار
عنصر فئة مجردة {Public Abstract void قبول (Ivisitor Postitor) ؛ التجريد الجمهور void dosomething () ؛ } واجهة ivisitor {public void visit (ConcreteElement1 EL1) ؛ زيارة باطلة عامة (ConcreteElement2 EL2) ؛ } class concreteElement1 يمتد العنصر {public void dosomething () {system.out.println ("This is element 1") ؛ } public void قبول (IVISitor Postitor) {visitor.visit (this) ؛ }} class concreteElement2 يمتد العنصر {public void dosomething () {system.out.println ("This is element 2") ؛ } public void قبول (IVISitor Postitor) {visitor.visit (this) ؛ }} زائر الفئة ينفذ ivisitor {public void visit (ConcreteElement1 el1) {el1.dosomething () ؛ } زيارة باطلة عامة (concreteElement2 el2) {el2.dosomething () ؛ }} class ObjectStruture {public static list <Element> getList () {list <element> list = new ArrayList <element> () ؛ ران عشوائي = جديد عشوائي () ؛ لـ (int i = 0 ؛ i <10 ؛ i ++) {int a = run.nextint (100) ؛ if (a> 50) {list.add (new ConcreteElement1 ()) ؛ } آخر {list.add (new ConcreteElement2 ()) ؛ }} قائمة الإرجاع ؛ }} client client {public static void main (string [] args) {list <element> list = objectStruture.getList () ؛ لـ (Element E: List) {E.Accept (New Visitor ()) ؛ }}} مزايا وضع الزوار
الامتثال لمبدأ المسؤولية الفردية: في أي سيناريو حيث يكون وضع الزائر قابلاً للتطبيق ، يجب أن تكون العمليات التي يجب تغليفها في الزائر في فئة العناصر لا علاقة لها بفئة العناصر نفسها وهي متقلبة. من ناحية ، يتوافق استخدام وضع الزائر مع مبدأ المسؤولية الفردية ، ومن ناحية أخرى ، لأن العمليات المغلفة عادة ما تكون متقلبة ، عندما تحدث التغييرات ، يمكن تحقيق توسيع الجزء المتغير دون تغيير فئة العناصر نفسها.
قابلية التوسع الجيدة: يمكن لفئات العناصر تمديد العمليات المختلفة من خلال قبول زوار مختلفين.
السيناريوهات المعمول بها لوضع الزوار
إذا كانت هناك بعض العمليات في كائن لا يرتبط بالكائن (أو مرتبط بشكل ضعيف) ومن أجل تجنب هذه العمليات تلوث الكائن ، يمكنك استخدام وضع الزائر لتغليف هذه العمليات في الزائر.
إذا كانت هناك عمليات مماثلة في مجموعة من الكائنات ، من أجل تجنب عدد كبير من التعليمات البرمجية المكررة ، يمكن أيضًا تغليف هذه العمليات المكررة في الزائر.
ومع ذلك ، فإن وضع الزوار ليس مثاليًا ، كما أنه يحتوي على عيوب قاتلة: إضافة فئات العناصر الجديدة أكثر صعوبة. من خلال رمز نمط الزائر ، يمكننا أن نرى أنه في فئة الزوار ، يكون لكل فئة عناصر طريقة المعالجة المقابلة الخاصة بها. بمعنى أنه يجب إضافة كل فئة من العناصر لتعديل فئة الزوار (بما في ذلك الفئة الفرعية أو فئة التنفيذ في فئة الزوار) ، وهو أمر مزعج للغاية للتعديل. وهذا يعني أنه عندما يكون عدد فئات العناصر غير مؤكد ، يجب استخدام وضع الزائر بحذر. لذلك ، فإن وضع الزائر أكثر ملاءمة لإعادة إنشاء الوظائف الحالية. على سبيل المثال ، إذا تم تحديد الوظائف الأساسية للمشروع ، فقد تم تحديد بيانات فئات العناصر بشكل أساسي ولن تتغير. كل ما سيتغير هو العمليات ذات الصلة داخل هذه العناصر. في هذا الوقت ، يمكننا استخدام وضع الزوار لإعادة تشكيل الكود الأصلي ، بحيث يمكن تعديل الوظائف الأصلية دون تعديل كل فئة عناصر.
لخص
نظرًا لأن GOF ، مؤلف نمط التصميم ، يصف وضع الزوار: في معظم الحالات ، تحتاج إلى استخدام وضع الزوار ، ولكن بمجرد أن تحتاج إليه ، فأنت بحاجة إليه حقًا. بالطبع هذا فقط للرجال الكبار الحقيقيين. في الواقع (على الأقل في البيئة التي أنا فيها) ، غالبًا ما يكون الكثير من الناس مدمنين على أنماط التصميم. عند استخدام نمط التصميم ، لا يفكرون بجدية في ما إذا كان النمط الذي يستخدمونه مناسبًا لهذا السيناريو ، ولكن في كثير من الأحيان يريدون فقط إظهار قدرتهم على التحكم في التصميم الموجهة للكائنات. إذا كان لديك هذه العقلية عند البرمجة ، فغالبًا ما تسيء استخدام نمط التصميم. لذلك ، عند تعلم أنماط التصميم ، يجب أن تفهم قابلية تطبيق الأنماط. من الضروري استخدام نمط لأنك تفهم مزاياه ، وليس استخدام نمط لأنك تفهم عيوبه ؛ بدلاً من استخدام نمط لأنك لا تفهم عيوبه ، وليس استخدام نمط لأنك لا تفهم مزاياه.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.