23 Образки дизайна Глава 19: Модель цепочки ответственности Java
Определение: позволяет нескольким объектам иметь возможность обрабатывать запрос, избегая тем самым взаимосвязи между отправителем и получателем запроса. Подключите эти объекты в цепь и передайте запрос вдоль цепочки, пока объект не обработает его.
Тип: поведенческий паттерн
Классовая диаграмма:
Давайте сначала посмотрим на кусок кода:
public void test (int i, запрос запроса) {if (i == 1) {Handler1.Response (запрос); } else if (i == 2) {handler2.response (запрос); } else if (i == 3) {handler3.response (запрос); } else if (i == 4) {handler4.response (запрос); } else {handler5.response (запрос); }}Бизнес -логика кода заключается в следующем: метод имеет два параметра: целое число I и запрос на запрос. Согласно значению I, который будет обрабатывать запрос, если i == 1, он будет обрабатываться Handler1, если я == 2, он будет обрабатываться Handler2 и так далее.
В программировании этот вид метода обработки бизнеса очень распространен. Все классы, которые запросы процесса, включают в себя, если ... else ... условные заявления о суждении, связанные с цепочкой ответственности для обработки запроса. Я верю, что все это часто используют. Преимущества этого метода заключается в том, что он очень интуитивно, прост и ясен и относительно прост в поддержании, но этот метод также имеет несколько головных болей:
Код раздутый: в фактических приложениях условия суждения обычно не так просты для определения того, составляет ли это 1 или 2. Это может потребовать сложных вычислений, возможно, запроса базы данных и т. Д. Это будет иметь много дополнительного кода. Если есть много условий суждения, то это, если ... иначе ... утверждение в основном невозможно прочитать.
Высокая степень связи: если мы хотим продолжать добавлять классы, которые запрашиваются, мы должны продолжать добавлять иначе, если условия суждения; Кроме того, порядок этого условия также записывается мертвым. Если мы хотим изменить заказ, мы можем только изменить это оператор условия.
Поскольку мы уже поняли недостатки, нам нужно найти способ их решить. Бизнес -логика этого сценария очень проста: если условие 1 будет выполнено, она будет обработана Handler1, и если он не будет выполнен, оно будет передано; Если условие 2 будет выполнено, оно будет обработано Handler2, и если оно не будет выполнено, оно будет передано, и так далее до конца состояния. Фактически, метод улучшения также очень прост, который заключается в том, чтобы поместить часть условий суждения в класс обработки. Это принцип модели связи ответственности.
Структура модели цепочки ответственности
Классовая диаграмма схемы цепочки ответственности очень проста, она состоит из абстрактно обработанного класса и его набора классов реализации:
Класс абстрактной обработки: класс абстрактной обработки в основном включает в себя переменную члена Nexthandler, указывающая на следующий класс обработки, и метод HandRequest, который обрабатывает запрос. Основная идея метода HandRequest заключается в том, что если условия обработки будут выполнены, этот класс обработки будет обработан, в противном случае он будет обработан Nexthandler.
Конкретный класс обработки: конкретный класс обработки в основном реализует конкретную логику обработки и применимые условия для обработки.
После понимания общей идеи модели цепочки ответственности, ее будет легче понять при рассмотрении кода:
Уровень класса {private int level = 0; public level (int level) {this.level = level; }; public boolean выше (уровень уровня) {if (this.level> = level.level) {return true; } вернуть false; }} Запрос класса {уровень уровня; публичный запрос (уровень уровня) {this.level = level; } public level getlevel () {return Level; }} ответ класса {} абстрактный класс обработчик {частный обработчик nexthandler; публичный окончательный ответ handleRequest (запрос запроса) {response response = null; if (this.gethandlerlevel (). выше (request.getlevel ())) {response = this.response (request); } else {if (this.nexthandler! = null) {this.nexthandler.handleRequest (request); } else {System.out.println ("----------"); }} возвратный ответ; } public void setNexThandler (обработчик обработчика) {this.nexthandler = Handler; } защищенный абстрактный уровень gethandlerlevel (); Ответ общедоступного абстрактного ответа (запрос на запрос); } class concetehandler1 Extends handler {защищенный уровень gethandlerlevel () {return new Level (1); } Ответ общедоступного ответа (запрос запроса) { System.out.println("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ class ConcreteHandler2 Extends Handler {Защищенный уровень Gethandlerlevel () {return New Level (3); System.out.println ("----- Запросы обрабатываются с помощью процессора 3 -----"); Handler2.setnexthandler (Handler3);В коде класс уровня имитирует условия определения; Запрос и ответ соответствуют запросам и ответам соответственно; Абстрактный класс -обработчик в основном судит условия, и здесь смоделируется уровень обработки. Только уровень обработки класса обработки выше, чем уровень запроса может быть обработан, в противном случае он будет передаваться следующему процессору для обработки.
Установите взаимосвязь выполнения передней и задней части цепочки в классе клиента и передайте запрос на первый класс обработки во время выполнения. Это шаблон цепочки ответственности. Функция, которую он выполняет, такая же, как и оператор If ... else ... в предыдущей статье.
Плюсы и минусы модели цепочки ответственности
По сравнению с if ... else…, шаблон цепочки ответственности обладает более низкой способностью к связи, потому что он распределяет условные суждения в различные классы обработки, и порядок обработки приоритетов этих классов обработки может быть установлен по желанию. Модель цепочки ответственности также имеет свои недостатки, которые совпадают с утверждением if ... else ... то есть, прежде чем найти правильный класс обработки, все условия суждения должны быть выполнены. Когда цепочка ответственности является относительно длинной, проблема с производительностью является более серьезной.
Применимые сценарии для модели цепочки ответственности
Так же, как в начальном примере, если вы чувствуете себя подавленным при использовании оператора if… else ... для организации цепочки ответственности, а код выглядит плохо, вы можете использовать режим цепочки ответственности, чтобы рефактор его.
Суммировать
Модель цепочки ответственности на самом деле является гибкой версией if ... else ... Заявление. Это помещает эти условия суждения в каждый класс обработки. Преимущество этого в том, что это более гибкое, но также вызывает риск. Например, при настройке взаимосвязи между классом обработки до и после класса обработки вы должны быть очень осторожны, чтобы судить о взаимосвязи между условной логикой до и после класса обработки, и быть осторожным, чтобы не иметь круговых ссылок в цепочке.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.