نمط سلسلة المسؤولية  نمط سلسلة المسؤولية بالانجليزية (Chain-of-responsibility pattern) في التصميم الكائني التوجه هو نمط تصميم سلوكي يتكون من مصدر كائنات الأمر وسلسلة من كائنات المعالجة . يحتوي كل كائن معالجة على منطق يحدد أنواع كائنات الأوامر التي يمكنه معالجتها ؛ يتم تمرير الباقي إلى كائن المعالجة التالي في السلسلة. توجد أيضًا آلية لإضافة كائنات معالجة جديدة إلى نهاية هذه السلسلة.  في تباين نموذج سلسلة المسؤولية القياسي، قد يعمل بعض المتعاملين كمرسلين، قادرين على إرسال الأوامر في مجموعة متنوعة من الاتجاهات، وتشكيل "شجرة المسؤولية" . في بعض الحالات، يمكن أن يحدث هذا بشكل متكرر، حيث تستدعي معالجة الكائنات كائنات معالجة أعلى بأوامر تحاول حل جزء أصغر من المشكلة ؛ في هذه الحالة، يستمر العودية حتى تتم معالجة الأمر، أو يتم استكشاف الشجرة بأكملها. قد يعمل مترجم XML بهذه الطريقة.  يروج هذا النمط لفكرة الاقتران السائب .  نمط سلسلة المسؤولية متطابق تقريبًا من الناحية الهيكلية مع نمط الديكور ، والفرق هو أنه بالنسبة لمصمم الديكور، تتعامل جميع الفئات مع الطلب، بينما بالنسبة لسلسلة المسؤولية، تتعامل إحدى الفئات في السلسلة بالضبط مع الطلب. هذا تعريف صارم لمفهوم المسؤولية في كتاب GoF. ومع ذلك، فإن العديد من التطبيقات (مثل المسجلات أدناه، أو معالجة حدث واجهة المستخدم، أو عوامل تصفية servlet في Java ، إلخ) تسمح للعديد من العناصر في السلسلة بتحمل المسؤولية.  سلسلة المسؤولية نمط التصميم هو واحد من ثلاثة وعشرين نمطًا معروفًا من "أنماط تصميم GoF" التي تصف الحلول المشتركة لمشاكل التصميم المتكررة عند تصميم برامج كائنية التوجه مرنة وقابلة لإعادة الاستخدام، أي كائنات يسهل تنفيذها، التغيير والاختبار وإعادة الاستخدام.  ما هي المشاكل التي يمكن أن يحلها نمط تصميم سلسلة المسؤولية؟    يحدد سلسلة من كائنات المستقبل التي تتحمل المسؤولية، اعتمادًا على ظروف وقت التشغيل، إما للتعامل مع الطلب أو إعادة توجيهه إلى جهاز الاستقبال التالي على السلسلة (إن وجد).  يتيح لنا ذلك إرسال طلب إلى سلسلة من المستلمين دون الحاجة إلى معرفة الشخص الذي يتعامل مع الطلب. يتم تمرير الطلب على طول السلسلة حتى يعالج المستلم الطلب. لم يعد مرسل الطلب مقترنًا بمستقبل معين.  راجع أيضًا فئة UML ومخطط التسلسل أدناه.  في الرسم التخطيطي لفئة UML أعلاه، codice_1 إلى فئة مستقبل معينة مباشرة. بدلاً من ذلك، يشير codice_1 codice_3 لمعالجة الطلب ( codice_4 ) ، مما يجعل codice_1 مستقلاً عن المتلقي الذي يتعامل مع الطلب. و codice_6 ، codice_7 ، و codice_8 الطبقات على تنفيذ codice_3 واجهة إما عن طريق المناولة أو إعادة توجيه الطلب (تبعا للظروف وقت التشغيل).  يوضح الرسم التخطيطي لتسلسل UML تفاعلات وقت التشغيل: في هذا المثال، يستدعي كائن codice_1 codice_11 على codice_12 (من النوع codice_3 ). يقوم codice_12 بإعادة توجيه الطلب إلى codice_15 ، والذي بدوره يعيد توجيه الطلب إلى codice_16 ، والذي يتعامل مع (ينفذ) الطلب.  يوجد أدناه مثال على هذا النمط في Java. يتم إنشاء المسجل باستخدام سلسلة من المسجلين، كل واحد تم تكوينه بمستويات سجل مختلفة. import java.util.Arrays; import java.util.EnumSet; import java.util.function.Consumer;  @FunctionalInterface public interface Logger {  class Runner {  تستخدم أمثلة لغة #C هذه تطبيق المسجل لتحديد مصادر مختلفة بناءً على مستوى السجل namespace ChainOfResponsibility  /* Output Writing to console: Entering function ProcessOrder(). Writing to console: Order record retrieved. Writing to console: Customer Address details missing in Branch DataBase. Writing to Log File: Customer Address details missing in Branch DataBase. Writing to console: Customer Address details missing in Organization DataBase. Writing to Log File: Customer Address details missing in Organization DataBase. Writing to console: Unable to Process Order ORD1 Dated D1 For Customer C1. Sending via email: Unable to Process Order ORD1 Dated D1 For Customer C1. Writing to console: Order Dispatched. Sending via email: Order Dispatched.  enum LogLevel end  abstract class Logger  end  class ConsoleLogger < Logger end  class EmailLogger < Logger end  class FileLogger < Logger end  logger = ConsoleLogger.new(LogLevel::All) logger1 = logger.next = EmailLogger.new(LogLevel::FunctionalMessage, LogLevel::FunctionalError) logger2 = logger1.next = FileLogger.new(LogLevel::Warning, LogLevel::Error)  logger.message("Entering function ProcessOrder().", LogLevel::Debug) logger.message("Order record retrieved.", LogLevel::Info)  logger.message("Customer Address details missing in Branch DataBase.", LogLevel::Warning) logger.message("Customer Address details missing in Organization DataBase.", LogLevel::Error)  logger.message("Unable to Process Order ORD1 Dated D1 For Customer C1.", LogLevel::FunctionalError)  logger.message("Order Dispatched.", LogLevel::FunctionalMessage) Chain of responsibility pattern example. from abc import ABCMeta, abstractmethod from enum import Enum, auto  class LogLevel(Enum):  class Logger:  class ConsoleLogger(Logger):  class EmailLogger(Logger):  class FileLogger(Logger):  def main():  if __name__ == "__main__":  <?php  abstract class Logger  class ConsoleLogger extends Logger  class EmailLogger extends Logger  class FileLogger extends Logger  $logger = new ConsoleLogger(Logger::ALL); $logger  $logger  /* Output Writing to console: Entering function ProcessOrder(). Writing to console: Order record retrieved. Writing to console: Customer Address details missing in Branch DataBase. Writing to a log file: Customer Address details missing in Branch DataBase. Writing to console: Customer Address details missing in Organization DataBase. Writing to a log file: Customer Address details missing in Organization DataBase. Writing to console: Unable to Process Order ORD1 Dated D1 For Customer C1. Sending via email: Unable to Process Order ORD1 Dated D1 For Customer C1. Writing to console: Order Dispatched. Sending via email: Order Dispatched.  تستخدم أطر Cocoa و Cocoa Touch ، المستخدمة في تطبيقات OS X وiOS على التوالي، بنشاط نمط سلسلة المسؤولية للتعامل مع الأحداث. تسمى الكائنات التي تشارك في السلسلة "كائنات المستجيب" ، وهي codice_17 من فئة NSResponder (OS X) / codice_18 (iOS). كافة الكائنات عرض ( codice_19 / codice_20 )، وكائنات رأي تحكم ( codice_21 / codice_22 )، والأشياء نافذة ( codice_23 / codice_24 )، والكائن التطبيق ( codice_25 / codice_26 ) هي كائنات الرد.  عادةً، عندما يتلقى أحد العروض حدثًا لا يمكنه التعامل معه، فإنه يرسله إلى العرض الإشرافي الخاص به حتى يصل إلى وحدة التحكم في العرض أو كائن النافذة. إذا لم تتمكن النافذة من معالجة الحدث، فسيتم إرسال الحدث إلى كائن التطبيق، وهو الكائن الأخير في السلسلة. على سبيل المثال: