Шаблон проектирования Chain of Responsibility

Цепочка обязанностей (Chain of Responsibility) представляет собой поведенческий шаблон проектирования, который позволяет организовать в системе уровни ответственности. Как это выглядит на практике?

Давайте представим, что у нас есть 3 три платежных карточки (метода): A, B и C, которые объединены одним банковским счетом. На каждой карточке -- разная сумма, на А -- $100, на B -- $300, на С -- $1000. Мы решили, что пока не потратим деньги с первой карточки (А), не будем трогать (B), ну а третью (C) вообще оставим на черный день. Итак, мы делаем заказ товара стоимостью $210. Так как существует цепочка обязанностей, первым на возможность оплаты будет проверена карточка A (иными словами, отработает метод А). Если оплата пройдет, цепь разорвется, а в случае неудачи запрос поступит на карточку B (перейдет к методу B). В нашем случае A, B и C представляют собой звенья цепи, а все вышеописанное -- не что иное, как цепочка обязанностей.

Схожим образом работает и банкомат:

Таким образом, цепочка обязанностей позволяет создавать цепочки объектов. То есть запрос поступит с одного конца и пройдет через каждый объект, пока не обнаружит подходящий обработчик.

Но давайте теперь посмотрим, как это выглядит в коде. Приведем пример с банковскими счетами. Мы имеем базовый Account, где находится логика соединения счетов цепью и определенные счета:

На самом деле, осталось лишь приготовить цепь, применяя вышеобъявленные звенья (Bank, Paypal, Bitcoin):

По материалам статьи «Design Patterns for Humans».