يقدم
تتمثل سلسلة المسؤولية في تمكين كائنات متعددة من الحصول على فرصة لمعالجة الطلب ، وبالتالي تجنب علاقة الاقتران بين المرسل ومستقبل الطلب. قم بتوصيل الكائن بسلسلة وقم بتمرير الطلب على طول السلسلة حتى يعالجه كائن.
وهذا هو ، بعد الطلب ، بدءًا من الكائن الأول ، فإن الكائن الذي يتلقى الطلب في السلسلة إما يتعامل معه شخصيًا أو يقوم بإعادة توجيهه إلى المرشح التالي في السلسلة. لا يعرف الكائن الذي يقدم الطلب بالضبط الكائن الذي سيتعامل معه - أي أن الطلب له جهاز استقبال ضمني. اعتمادًا على وقت التشغيل ، يمكن لأي مرشح الاستجابة للطلب المقابل. عدد المرشحين تعسفي. يمكنك تحديد المرشحين المشاركين في السلسلة في وقت التشغيل.
نص
بالنسبة لتطبيقات JavaScript ، يمكننا استخدام ميزات النموذج الأولي لتنفيذ نمط سلسلة المسؤولية.
نسخة الكود كما يلي:
var no_topic = -1 ؛
موضوع var ؛
معالج الوظائف (S ، T) {
this.successor = s || باطل؛
this.topic = t || 0 ؛
}
Handler.Prototype = {
مقبض: وظيفة () {
if (this.succors) {
this.successor.handle ()
}
} ،
HAS: Function () {
إرجاع this.topic! = no_topic ؛
}
} ؛
المعالج يقبل فقط 2 معلمات. الأول هو الخلف (المستخدم لتمرير طلب المعالجة لأسفل) ، والثاني هو مستوى التمرير (الذي يمكن استخدامه للتحكم في ما إذا كنت تريد إجراء عملية على مستوى معين ، أم لا). يعرض النموذج الأولي معالج طريقة المقبض ، وهو مفتاح تنفيذ هذا النمط. دعونا نلقي نظرة أولاً على كيفية استخدام الكود أعلاه.
نسخة الكود كما يلي:
تطبيق var = معالج جديد ({
مقبض: وظيفة () {
console.log ('App Handle') ؛
}
} ، 3) ؛
Var Dialog = New Handler (App ، 1) ؛
زر var = معالج جديد (مربع حوار ، 2) ؛
button.handle () ؛
قم بتغيير الكود من خلال ميزة النموذج الأولي واتصل بالرمز من button.handle ()-> dialog.handle ()-> app.handle ()-> معلمة Handle (). الثلاثة الأولى هي جميع المقابض التي تسمي النموذج الأولي. أخيرًا ، تم العثور على المقبض في المعلمة التي تم تمريرها ، ثم النتيجة هي الإخراج ، مما يعني أنه تتم معالجة الطبقة الأخيرة فقط.
فكيف لا يمكنني معالجة كائن الحوار إلا عند الاتصال؟ في الواقع ، يمكنك تحديد طريقة مقبض كائن مثيل الحوار ، ولكن يجب القيام به قبل الزر الجديد. الرمز كما يلي:
نسخة الكود كما يلي:
تطبيق var = معالج جديد ({
مقبض: وظيفة () {
console.log ('App Handle') ؛
}
} ، 3) ؛
Var Dialog = New Handler (App ، 1) ؛
Dialog.handle = function () {
console.log ('مربع الحوار قبل ...')
// هنا هي عمليات المعالجة المحددة
console.log ('مربع الحوار بعد ...')
} ؛
زر var = معالج جديد (مربع حوار ، 2) ؛
button.handle () ؛
نتيجة التنفيذ لهذا الرمز هي نتيجة العملية في مربع الحوار ، ولم تعد عملية تنفيذ المقبض المحددة في المعلمات التي تم تمريرها إلى التطبيق.
فهل يمكننا أن نجعلها من خلال عملية الخلف ثم دع الخلف يستمر في التعامل معه؟ الإجابة هي نعم ، ولكن بعد استدعاء المقبض ، تحتاج إلى استخدام خصائص النموذج الأولي للاتصال بالرمز التالي:
نسخة الكود كما يلي:
handler.prototype.handle.call (هذا) ؛
معنى هذه الجملة هو استدعاء طريقة مقبض النموذج الأولي لمواصلة استدعاء طريقة المقبض لخليفةها (أي الخلف). يتم التعبير عن الرمز التالي على النحو التالي: سيتم تنفيذ المقابض المحددة بواسطة الكائنات الثلاثة للزر/الحوار/التطبيق.
نسخة الكود كما يلي:
تطبيق var = معالج جديد ({
مقبض: وظيفة () {
console.log ('App Handle') ؛
}
} ، 3) ؛
Var Dialog = New Handler (App ، 1) ؛
Dialog.handle = function () {
console.log ('مربع الحوار قبل ...')
// هنا هي عمليات المعالجة المحددة
handler.prototype.handle.call (هذا) ؛ // استمر في الصعود
console.log ('مربع الحوار بعد ...')
} ؛
زر var = معالج جديد (مربع حوار ، 2) ؛
button.handle = function () {
console.log ("زر قبل ...")
// هنا هي عمليات المعالجة المحددة
handler.prototype.handle.call (هذا) ؛
console.log ("زر بعد ...")
} ؛
button.handle () ؛
من خلال نتائج تشغيل الكود ، يمكننا أن نرى أنه إذا كنت ترغب في معالجته بنفسك أولاً ثم اتصل بالخلف لمعالجته ، تنفيذ المعالج. رمز في النهاية. إذا كنت ترغب في معالجة رمز الخلف أولاً ، قم بتنفيذ المعالج. رمز في البداية.
لخص
غالبًا ما يتم استخدام سلسلة المسؤوليات مع نمط الجمع ، بحيث يمكن أن يكون المكون الأصل للمكون بمثابة خلفه.
في الوقت نفسه ، يبدو أن آلية فقاعة الأحداث في DOM تشبه إلى حد ما هذا. على سبيل المثال ، بعد النقر فوق زر ، إذا لم يتم منع الفقاعة ، فإن حدث النقر سيخفق دائمًا نحو العنصر الأصل. يمكن أيضًا استخدام هذه الآلية للتعامل مع العديد من المشكلات ذات الصلة ، مثل رمز المثال "مثال 1: إدارة الأحداث المركزية" في نمط تصميم هذه السلسلة.