Шаблон за проектиране на веригата на отговорността

Прочетете описанието на други модели.

проектиране

Ефективно и компактно внедряване на механизъм за обработка на поток от събития / заявки / съобщения в системи с потенциално голям брой манипулатори.

Моделът събитие/манипулатор е широко използван в софтуерни системи от различни области. По принцип това е графичен потребителски интерфейс, където събитията, генерирани от потребителски действия, се обработват по различни начини от интерфейсни елементи. Не трябва да забравяме и WinAPI, който много често прилага такъв модел. В повечето източници този модел се нарича Event Loop.

От една страна, всичко е доста прозрачно. Има много видове съобщения, има много манипулатори за тези съобщения. Задачата е да се обработи всяко съобщение в нишката с манипулатор, свързан с неговия специфичен тип. Просто казано, трябва да имате ефективен механизъм за свързване на типове съобщения и манипулатори.

В повечето случаи, с фиксиран и малък брой манипулатори в системата, е достатъчно да се приложи този механизъм, базиран на конструкцията if-then-else. Нещата обаче не винаги са толкова прости. Първо, не винаги се знае предварително точно колко манипулатори са необходими. Второ, добавянето на нов тип съобщение към системата обикновено води до появата на нов манипулатор, чиято реализация вече се превръща в наистина трудна задача.

За решаване на такива проблеми има шаблон - „Верига от отговорности“.

Идеята на шаблона е да организира повтарящ се конвейер от манипулатори, в който всеки манипулатор може или да обработва входящото съобщение (например само съобщения от определен тип), или да делегираобработка към следващия манипулатор в конвейера. Друг вариант е обработка и последващо предаване. В същото време, за да инициира обработката на конкретно съобщение, клиентът трябва само да го предаде на първия манипулатор в конвейера.

Практически пример

Помислете за може би най-очевидния пример за модел - компютърна мрежа. Наистина - голям брой манипулатори - мрежови възли (компютри, сървъри, рутери) и голям брой типове мрежови заявки.

Нека има 4 вида манипулатори в опростен и измислен мрежов модел - мрежа, рутер, препращач и сървър. Също така има само един вид заявка – заявка за обработка от сървъра. Манипулаторите имат следното поведение: мрежата просто предава заявката в своята среда, рутерът предава заявката от една мрежа към друга, пренасочващият предава заявката към определен хост, сървърът обработва заявката.

Мрежовите възли са конвейер от манипулатори. Заявката е конкретно съобщение. Заявката, движеща се по веригата, се обработва (маршрутизира, препраща) от всеки от нейните възли и се предава по-нататък. Докато накрая се обработи от сървъра.

класова диаграма

Основният момент, на който трябва да обърнете внимание, е методът за организиране на тръбопроводната обработка. В този случай се използва следният подход. Всички манипулатори имплементират един абстрактен клас, RequestHandled, който съдържа препратка към себе си (наследник) за делегиране на отговорности за обработка на следващия манипулатор в конвейера. Реализацията по подразбиране на метода handleRequest() прилага такова делегиране.

веригата