Верига на отговорност, Модели в C# и
Веригата на отговорността е модел на поведенчески дизайн, който избягва твърдото свързване на подателя на заявка с получателя, като позволява на множество субекти да обработват заявката. Всички възможни манипулатори на заявки образуват верига и самата заявка се движи по тази верига, докато някой от нейните обекти не обработи заявката. Всеки обект при получаване на заявка избира или да обработи заявката, или да прехвърли изпълнението на заявката на следващия във веригата.
Кога се прилага веригата на отговорност?
Когато има повече от един обект, който може да обработи определена заявка
Когато е необходимо да се прехвърли заявка за изпълнение към един от няколко обекта, без да се уточнява точно кой обект
Когато набор от обекти е зададен динамично
Формална дефиниция в C#:
Handler : дефинира интерфейс за обработка на заявка. Може също да дефинира връзка към следващия манипулатор на заявки
ConcreteHandler1 и ConcreteHandler2 : Конкретни манипулатори, които изпълняват функционалност за обработка на заявка. Ако обработката е невъзможна и има връзка към следващия манипулатор, заявката се предава на този манипулатор
В този случай, за простота на примера, числото се предава като параметър и в зависимост от стойността на това число манипулаторите и вземат решения относно обработката на заявката.
Клиент: изпраща заявка до обекта Handler
Тоест имаме малка верига за обработка на заявки:
Използването на верига от отговорност ни дава следните предимства:
Хлабава връзка между обектите. Подателят и получателят на заявката не знаят нищо един за друг. Клиентът не познава веригата от обекти, кои обекти я съставят, като заявка в неясе предава.
Можете лесно да добавяте нови типове обекти към веригата, които реализират общ интерфейс.
В същото време моделът има недостатък: никой не гарантира, че заявката в крайна сметка ще бъде обработена. Ако във веригата няма необходим манипулатор, тогава заявката просто излиза от веригата и остава необработена.
Използването на модел е доста често срещано в нашия живот. Доста често срещана е ситуацията, когато служителите се сменят един друг по веригата за правене на някакъв бизнес, а в крайна сметка се оказва, че той не е направен. Или когато отидем в клиниката, но не знаем точно естеството на заболяването. В този случай отиваме на терапевт и в зависимост от заболяването той може или да се лекува сам, или да го изпрати при други специализирани лекари за лечение.
Нека разгледаме конкретен пример. Да предположим, че трябва да изпратите определена сума пари на човек. Не знаем обаче точно кой метод на изпращане може да се използва: банков превод, системи за превод като Western Union и Unistream или система за онлайн плащане PayPal. Трябва само да въведем сумата, да изберем лицето и да щракнем върху бутона. Подобна система може да се използва в сайтове на свободна практика, където всички взаимоотношения между изпълнители и клиенти възникват косвено чрез функциите на системата и където не е необходимо да знаете точните данни за получателя.
Класът Receiver, използвайки конструктора и подадените към него параметри, задава възможните платежни системи, които да се използват. Когато извършвате плащане, всеки отделен обект на PaymentHandler ще проверява дали получателят има определен тип плащане. И ако типът плащане на получателя съответства на обекта PaymentHandler, тогава този обект извършва плащането. Ако необходимият метод на плащане не е наличенсе определя, тогава парите остават в системата.
В същото време предимството на веригата е, че ви позволява да подредите последователност от манипулиращи обекти в нея в зависимост от техния приоритет.