23 أنماط التصميم الفصل 19: نموذج سلسلة مسؤولية جافا
التعريف: يسمح لكائنات متعددة أن تتاح لها الفرصة لمعالجة الطلب ، وبالتالي تجنب علاقة الاقتران بين المرسل ومستقبل الطلب. قم بتوصيل هذه الكائنات بسلسلة وقم بتمرير الطلب على طول السلسلة حتى يعالجها كائن.
النوع: نمط سلوكي
مخطط الفصل:
دعونا أولاً نلقي نظرة على قطعة من الكود:
اختبار void العام (int i ، طلب طلب) {if (i == 1) {handler1.Response (request) ؛ } آخر إذا (i == 2) {handler2.response (request) ؛ } آخر إذا (i == 3) {handler3.response (request) ؛ } آخر إذا (i == 4) {handler4.response (request) ؛ } آخر {handler5.response (request) ؛ }}منطق العمل للرمز هو كما يلي: الطريقة لها معلمتان: عدد صحيح I وطلب طلب. وفقًا لقيمة I ، الذي سيتعامل مع الطلب ، إذا كنت == 1 ، فسيتم التعامل معها بواسطة Handler1 ، إذا كان i == 2 ، فسيتم التعامل معها بواسطة Handler2 ، وهكذا.
في البرمجة ، يعد هذا النوع من طريقة معالجة الأعمال شائعة جدًا. جميع الفئات التي تتضمن طلبات المعالجة إذا ... أخرى ... بيانات الحكم الشرطية المرتبطة بسلسلة من المسؤولية لمعالجة الطلب. أعتقد أن الجميع يستخدمونها غالبًا. مزايا هذه الطريقة هي أنها بديهية للغاية وبسيطة وواضحة وسهلة الصيانة نسبيًا ، ولكن هذه الطريقة لديها أيضًا العديد من الصداع:
الكود المتضخم: في التطبيقات الفعلية ، عادة ما تكون شروط الحكم بسيطة للغاية لتحديد ما إذا كان 1 أو 2. قد يتطلب حسابات معقدة ، وربما الاستعلام عن قاعدة البيانات ، وما إلى ذلك. سيكون لهذا الكثير من التعليمات البرمجية الإضافية. إذا كان هناك العديد من شروط الحكم ، فإن هذا إذا ... آخر ... البيان مستحيل في الأساس قراءته.
درجة اقتران عالية: إذا أردنا الاستمرار في إضافة فصول تطلب ، يجب أن نستمر في إضافة آخر إذا كانت شروط الحكم ؛ بالإضافة إلى ذلك ، يتم كتابة ترتيب هذا الشرط أيضًا إلى الموتى. إذا أردنا تغيير الترتيب ، فيمكننا تعديل عبارة الشرط هذه فقط.
نظرًا لأننا فهمنا بالفعل أوجه القصور ، نحتاج إلى إيجاد طريقة لحلها. منطق العمل لهذا السيناريو بسيط للغاية: إذا تم استيفاء الحالة 1 ، فسيتم معالجتها بواسطة Handler1 ، وإذا لم يتم الوفاء بها ، فسيتم نقلها ؛ إذا تم استيفاء الحالة 2 ، فسيتم معالجتها بواسطة Handler2 ، وإذا لم يتم الوفاء بها ، فسيتم تمريرها ، وما إلى ذلك حتى نهاية الحالة. في الواقع ، فإن طريقة التحسين بسيطة للغاية ، والتي تتمثل في وضع جزء من شروط الحكم في فئة المعالجة. هذا هو مبدأ نموذج اتصال المسؤولية.
هيكل سلسلة المسؤولية
إن الرسم البياني للفصل لنمط سلسلة المسؤولية بسيط للغاية ، وهو يتألف من فئة معالجة مجردة ومجموعة من فئات التنفيذ:
فئة المعالجة التجريدية: تتضمن فئة المعالجة التجريدية بشكل أساسي nexthandler متغير عضو يشير إلى فئة المعالجة التالية وطريقة يسيطر على الطلب. الفكرة الرئيسية لطريقة Handrequest هي أنه إذا تم استيفاء شروط المعالجة ، فستتم معالجة فئة المعالجة هذه ، وإلا فإنه سيتم معالجته بواسطة Nexthandler.
فئة المعالجة المحددة: فئة المعالجة المحددة تنفذ بشكل أساسي منطق المعالجة المحدد والشروط القابلة للتطبيق للمعالجة.
بعد فهم الفكرة العامة لنموذج سلسلة المسؤولية ، سيكون من الأسهل فهمها عند النظر إلى الكود:
مستوى الفئة {private int level = 0 ؛ المستوى العام (مستوى int) {this.level = level ؛ } ؛ منطقية عامة أعلاه (مستوى المستوى) {if (this.level> = level.level) {return true ؛ } إرجاع خطأ ؛ }} طلب الفئة {مستوى المستوى ؛ طلب عام (مستوى المستوى) {this.level = level ؛ } المستوى العام getLevel () {مستوى العودة ؛ }} استجابة الفئة {} معالج الفئة الملخص {المعالج الخاص nexthandler ؛ الاستجابة النهائية العامة HandleRequest (طلب طلب) {استجابة الاستجابة = null ؛ if (this.gethandlerlevel (). أعلاه (request.getlevel ())) {reponse = this.reSponse (request) ؛ } آخر {if (this.nexthandler! = null) {this.nexthandler.handleRequest (request) ؛ } آخر {system.out.println ("----------") ؛ }} استجابة الإرجاع ؛ } public void setNexThandler (Handler Handler) {this.nexthandler = Handler ؛ } المحمية المحمية Gethandlerlevel () ؛ استجابة الاستجابة المجردة العامة (طلب الطلب) ؛ } class concreteHandler1 يمتد معالج {المستوى المحمي gethandlerlevel () {return New Level (1) ؛ } استجابة الاستجابة العامة (طلب طلب) { System.out.println("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ class يمتد ConcreteHandler2 المعالج {REVILED GETHANDLEVER () System.out.println (------ تتم معالجتها بواسطة المعالج 3 --- ") ؛ Handler1.SetNexthandler (Handler2) ؛في الكود ، يحاكي فئة المستوى شروط التحديد ؛ يتوافق الطلب والاستجابة مع الطلبات والردود على التوالي ؛ يحكم معالج الطبقة التجريدية بشكل أساسي الشروط ، ويتم محاكاة مستوى المعالجة هنا. فقط مستوى المعالجة لفئة المعالجة هو أعلى من مستوى الطلب يمكن معالجته ، وإلا سيتم تسليمه إلى المعالج التالي للمعالجة.
قم بتعيين علاقة التنفيذ الأمامية والخلفية للسلسلة في فئة العميل ، وقم بتسليم الطلب إلى فئة المعالجة الأولى أثناء التنفيذ. هذا هو نمط سلسلة المسؤولية. الوظيفة التي تكملها هي نفس بيان IF ... آخر ... في المقالة السابقة.
إيجابيات وسلبيات نموذج سلسلة المسؤولية
بالمقارنة مع إذا ... آخر ... ، فإن نمط سلسلة المسؤولية لديه قدرة اقتران أقل لأنه يوزع الأحكام المشروطة في فئات المعالجة المختلفة ، ويمكن تعيين ترتيب المعالجة الأولوية لفئات المعالجة هذه حسب الرغبة. يحتوي نموذج سلسلة المسؤولية أيضًا على عيوبه ، وهو نفس البيان IF ... آخر ... ، أي قبل العثور على فئة المعالجة الصحيحة ، يجب تنفيذ جميع شروط الحكم. عندما تكون سلسلة المسؤولية طويلة نسبيًا ، تكون مشكلة الأداء أكثر خطورة.
السيناريوهات المعمول بها لسلسلة مسؤولية نموذج المسؤولية
تمامًا مثل مثال البداية ، إذا كنت تشعر بالإرهاق عند استخدام بيان IF ... آخر ... لتنظيم سلسلة من المسؤولية ويبدو الكود سيئًا ، فيمكنك استخدام سلسلة المسؤولية لإعادة تشكيلها.
لخص
نموذج سلسلة المسؤولية هو في الواقع نسخة مرنة من IF ... آخر ... بيان. إنه يضع شروط الحكم هذه في كل فئة معالجة. ميزة ذلك هي أنها أكثر مرونة ، ولكنها تجلب أيضًا المخاطر. على سبيل المثال ، عند إعداد العلاقة بين فئة المعالجة قبل وبعد فئة المعالجة ، يجب أن تكون حريصًا جدًا على الحكم على العلاقة بين المنطق الشرطي قبل وبعد فئة المعالجة ، وتحرز على عدم وجود مراجع دائرية في السلسلة.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.