تصف هذه المقالة استخدام وضع سلسلة المسؤولية للطلاب لأخذ إجازة. شاركه للرجوع إليه ، على النحو التالي:
1. تعريف نمط
في نموذج سلسلة المسؤولية ، يتم توصيل العديد من الكائنات من خلال الإشارات إلى منزلها التالي من قبل كل كائن ، وتشكيل سلسلة. يتم تمرير طلب تطبيق العميل على هذه السلسلة حتى يقرر كائن على السلسلة معالجة الطلب. لا يعرف العميل الذي يقدم هذا الطلب الكائن الموجود على السلسلة في نهاية المطاف يعالج الطلب ، والذي يسمح للنظام بإعادة تنظيم السلسلة ديناميكيًا وتعيين المسؤوليات دون التأثير على العميل.
(1) دور المعالج التجريدي: تحديد واجهة للمعالجة. إذا لزم الأمر ، يمكن للواجهة تحديد طريقة لتعيين وإعادة الإشارة إلى المنزل التالي. عادة ما يتم تنفيذ هذا الدور من قبل Java Abstract Class أو Java Interface.
(2) دور المعالجة المحدد: بعد تلقي الطلب ، يمكن للمعالج المحدد اختيار معالجة الطلب أو نقل الطلب إلى المنزل التالي.
2. أمثلة نموذجية
1 تحليل نمط
نحن نقترض إجازة الطلاب لتوضيح هذا النموذج
2 مخطط فئة ثابت لنمط سلسلة المسؤولية
3 أمثلة رمز
3.1 واجهة الطلاب
حزمة com.demo.chain.message ؛/** * واجهة الطالب * * Author * */الواجهة العامة isthudent {/** * الحصول على حالة حالة الطالب * * 0: الأشياء الصغيرة (يمكن لمراقبة الفصل الدراسي أن يتعامل معها) * * 1: لا يمكن أن يتعامل مع المعلم مع المعلم * * 2: لا يمكن للمعلم التعامل مع الأشياء الأساسية التي يمكن التعامل معها * * * */ / ** * احصل على رسالة إجازة الطالب * * @RETURN */ سلسلة عامة getRequestMessage () ؛}3.2 يدرك الطلاب طالبًا
Package com.demo.chain.message ؛/** * فئة تنفيذ الطلاب * * Author * */طالب الطبقة العامة ينفذ istudent {// حجم الحالة الخاصة int state = -1 ؛ // رسالة وداع رسالة السلسلة النهائية الخاصة ؛ الطالب العام (int state ، string message) {this.state = state ؛ this.message = رسالة ؛ } / ** * احصل على حالة إجازة الطالب * * 0: الأشياء الصغيرة (يمكن أن تتعامل شاشة الفصل) * * 1: لا يمكن لمراقبة الفصل التعامل مع الأشياء التي يمكن للمعلم التعامل معها * * * 2: لا يمكن للمعلم التعامل مع الأشياء التي يمكن للمدير التعامل معها * * * * / public int getState () {return this.state ؛ } / ** * احصل على رسالة إجازة الطالب * * @RETURN * / public string getRequestMessage () {return this.message ؛ }}3.3 واجهة المعالجة التجريدية
package com.demo.chain.handle ؛ استيراد com.demo.chain.message.istudent ؛/** * واجهة المعالج الملخص * * Author * */واجهة عامة iHandler {// طلب طلب HandleRequest العام (istudent student) ؛ // قم بتعيين المعالج التالي الفراغ العام Sethandler (معالج iHandler) ؛}3.4 Abstracthandler
حزمة com.demo.chain.handle ؛ استيراد com.demo.chain.message.istudent ؛/** * معالج الملخص * * Author * */فئة Abstracthandler المجردة العامة. // ترك مستوى int الخاص = -1 ؛ . }. // تعامل مع الطلبات العامة void handleRequest (student stermon) {// إذا كان كائن الطالب موجودًا إذا (الطالب! = null) {if (this.state == student.getState ()) {// إذا كان مستوى الإجازة متسقًا مع الحالي ، فسيتم معالجة الكائن الحالي هذا. } آخر {if (this.handler! = null) {system.out.println ("اطلب القائد المتفوق للرد!") ؛ // إذا تعذر معالجة الكائن الحالي ، فسيتم تسليمه إلى المعالج التالي لمعالجة this.handler.handlerequest (الطالب) ؛ }}} ستر }}3.5 فرقة زعيم
حزمة com.demo.chain.handle ؛ استيراد com.demo.chain.message.istudent ؛/** * معالج الملخص * * Author * */فئة Abstracthandler المجردة العامة. // ترك مستوى int الخاص = -1 ؛ . }. // تعامل مع الطلبات العامة void handleRequest (student stermon) {// إذا كان كائن الطالب موجودًا إذا (الطالب! = null) {if (this.state == student.getState ()) {// إذا كان مستوى الإجازة متسقًا مع الحالي ، فسيتم معالجة الكائن الحالي هذا. } آخر {if (this.handler! = null) {system.out.println ("اطلب القائد المتفوق للرد!") ؛ // إذا تعذر معالجة الكائن الحالي ، فسيتم تسليمه إلى المعالج التالي لمعالجة this.handler.handlerequest (الطالب) ؛ }}} ستر }}3.6 المعلم-المعلم
package com.demo.chain.impl ؛ استيراد com.demo.chain.handle.abstracthandler ؛ استيراد com.demo.chain.message.istudent ؛/** * معالج المعلم * * @Auuthor * */Public Class Teacherhandler يمتد Abstracthandler {public teacherhandler () {sup (1) ؛ }. }}3.7 مدير المدرسة
package com.demo.chain.impl ؛ استيراد com.demo.chain.handle.abstracthandler ؛ استيراد com.demo.chain.message.istudent ؛/** * المعالج الرئيسي * * @author * */public class schoolmasternler يمتد Abstracthandler {public Schoollerler () {sup (2) ؛ }. }}3.8 المظهر الفئة 1 ProcessHandler
حزمة com.demo.chain.process ؛ استيراد com.demo.chain.handle.ihandler ؛ استيراد com.demo.chain.impl.schoolmasterhandler ؛ استيراد com.demo.chain.impl.squadleaderhandler ؛ استيراد com.demo.impl.impl.teacherhandler سلسلة سلسلة * * Author * */Public Class ProcessHandler {// Class Leader Handler Final Ihandler Sqmshandler ؛ // معالج المعلمين النهائي الخاص iHandler TechHandler ؛ // المعالج الرئيسي النهائي الخاص iHandler Scmshandler ؛ // Singleton Mode Private Static ProcessHandler = New ProcessHandler () ؛ / *** طريقة مُنشأة لإنشاء سلسلة مسؤولية لمعالجة الإجازة*/ private ProcessHandler () {// إنشاء كائن معالجة // Class Leader this.sqmshandler = New SquadleAderHandler () ؛ // teacher this.techhandler = new teacherhandler () ؛ // principal this.scmshandler = new SchoolMasterHandler () ؛ / *** إنشاء سلسلة من المسؤولية*/// قم بتعيين المعالج التالي لزعيم الفصل: المعلم this.sqmshandler.sethandler (this.techhandler) ؛ // قم بتعيين المعالج التالي للمعلم: Principal this.techhandler.sethandler (this.scmshandler) ؛ } / ** * احصل على مثيل كائن Singleton * * @RETURN * / Public Static ProcessHandler getInstance () {return ProcessHandler ؛ } / ** * أرسل طلب إجازة * * param message * / public void sendMessage (student student) {// send to the first the blayler: class class يتولى هذا. }}3.9 عميل العميل
حزمة com.demo ؛ استيراد java.util.random ؛ استيراد com.demo.chain.message.istudent ؛ استيراد com.demo.chain.message.student ؛ استيراد com.demo.chain.process.processhandler ؛/** * التطبيق الرئيسي * * */عميل الفئة العامة args) {// احصل على ظهور processHandler ProcessHandler = processHandler.getInstance () ؛ // إنشاء كائن رقم عشوائي لإنشاء كائن الطالب عشوائيًا عشوائيًا = جديد عشوائي () ؛ لـ (int i = 0 ؛ i <3 ؛ i ++) {// الحصول على رقم عشوائي int radom = random.nextint (3) ؛ student student = طالب جديد (رادوم ، "الطالب" + i + "أنا مريض ، أريد أن أترك إجازة!") ؛ system.out.println ( ########################################################################################################## ########################################################################################################## #######################################################################################################"); // معالجة ProcessHandler.SendMessage (الطالب) ؛ system.out.println ( }}}4 نتائج التشغيل
## طلب
اطلب رد من القائد المتفوق!
اطلب رد من القائد المتفوق!
رد المدير: الطالب 0 مريض ويريد أن يأخذ إجازة!
## طلب
## طلب
اطلب رد من القائد المتفوق!
اطلب رد من القائد المتفوق!
رد المدير: الطالب 1 مريض ويريد أن يأخذ إجازة!
## طلب
## طلب
مراقب الفصل المعتمد: الطالب 2 مريض ويريد أن يأخذ إجازة!
## طلب
ثالثا. مبادئ تصميم هذا النمط
1 مبدأ "Open-Close"
2 مبدأ المسؤولية الفردية
4. استخدام المناسبات
(1) هناك كائنات متعددة تعالج نفس الطلب. لا يزال من غير المؤكد أي شخص يستخدم للتعامل معه. يتم تحديده فقط في وقت التشغيل الذي يعالجه الكائن.
(2) تحتوي الرسالة على العديد من المستلمين ، والكائن المستلم غير واضح. ما عليك سوى إرسال رسالة إلى أحد الكائنات والتعامل معها داخليًا.
(3) قد تزيد كائنات المعالجة المتعددة من نفس الرسالة أو تنخفض ديناميكيًا ، ويجب تحديدها ديناميكيًا.
5. مخطط فئة ثابتة لنمط سلسلة المسؤولية
لمزيد من المحتوى المتعلق بـ Java ، يمكن للقراء المهتمين بهذا الموقع عرض الموضوعات: "بنية بيانات Java وبرنامج تعليمي الخوارزمية" ، "ملخص Tips Java Operation DOM" ، "ملخص ملف Java ونصائح تشغيل الدليل" و "ملخص نصائح Java Cache Operation Tips"
آمل أن يكون هذا المقال مفيدًا لبرمجة Java للجميع.