Паттерн Chain of Responsibility
Також відомий як
Класифікація
За метою: поведінковий За застосовністю: до об'єктів
Частота використання
Нижче за середню - 1 2 3 4 5
Призначення
Паттерн Chain of Responsibility - дозволяє уникнути прив'язки запиту до запиту, при цьому даючи шанс обробити цей запит кільком об'єктам. Паттерн Chain of Responsibility – зв'язує в ланцюжок запиту і передає запит вздовж цього ланцюжка, поки один з об'єктів, що становлять цей ланцюжок, не обробить запит, що передається.
У реальному житті складно знайти раціональний аналог моделі, яку описує патерн Chain of Responsibility. Для кращого розуміння роботи патерну можна навести нереалістичний приклад. Наприклад, пропонується розглянути роботу бюро перекладів з англійської на інші іноземні мови. Є три перекладачі і Перекладачі сидять за столами один за одним. Коли клієнт приходить в бюро, то він має справу тільки з одним перекладачем, який сидить за першим столом. Клієнт дає перекладачеві документ для перекладу на певну мову. якщо не в змозі, то передає документ далі по ланцюжку (що сидить у нього за спиною) перекладачеві і так далі.
Нижче на малюнку показано, що клієнту потрібно зробити переклад документа з китайської на англійську. Клієнт дає документ китайською мовою перекладачеві. перекладач розуміє, що не в змозі зробити переклад і передає документ далі по ланцюжку, наступному перекладачеві. Наступним перекладачем є перекладач, який може зробити переклад. перекладач робить переклад документа англійською мовою і повертає документ клієнту. перекладач залишився не задіяним у цьомувипадку.

Якщо жоден із перекладачів не може перекласти документ, документ втрачається. Нижче на малюнку показано, що клієнту потрібно зробити переклад документа з японської на англійську. Клієнт дає документ японською перекладачеві. Перекладач розуміє, що не в змозі зробити переклад і передає документ далі по ланцюжку, наступному перекладачеві. Наступним перекладачем виявляється перекладач. перекладач розуміє, що не в змозі зробити переклад і передає документ далі по ланцюжку, наступному перекладачеві. Наступним перекладачем є перекладач. Англоукраїнський перекладач розуміє, що не в змозі зробити переклад і оскільки за ним уже немає більше перекладачів, то просто викидає документ у кошик зі сміттям (умовно).
Позитивні сторони такого підходу полягають у тому, що клієнт не знає про того перекладача, який робить переклад, при цьому кожен з перекладачів знає лише про одного перекладача (який у нього за спиною), що забезпечує слабку пов'язаність усієї системи. Недолік підходу в тому, що немає жодних гарантій, що переклад буде виконано, оскільки документ може досягти кінця ланцюжка і зникнути.
Структура патерну UML
Приклад до глави: \013_Chain of Responsibility\001_Chain

Структура патерну мовою C#
h1.Successor = h2; h1.HandleRequest(1); h1.HandleRequest(2); > >