моя контактная информация
Почтамезофия@protonmail.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Шаблон «Цепочка ответственности» — это шаблон поведенческого проектирования, который позволяет нескольким объектам обрабатывать запросы последовательно, и каждый объект может выбирать, обрабатывать ли запрос или передавать его следующему объекту. Этот шаблон обеспечивает большую гибкость и масштабируемость за счет разделения отправителя и получателя запросов. Ниже приводится подробное введение в модель цепочки ответственности:
Ядром модели цепочки ответственности является разработка цепочки запросов и идентификация конца цепочки. Он соединяет несколько объектов обработки запросов в цепочку и позволяет запросу передаваться по цепочке до тех пор, пока объект в цепочке не решит обработать запрос. Клиент, делающий запрос, не знает, какой объект в цепочке в конечном итоге будет обрабатывать запрос, что позволяет системе динамически реорганизовывать и распределять обязанности, не затрагивая клиента.
Диаграмма классов:
Модель цепочки ответственности в основном включает в себя следующие роли:
Абстрактный обработчик (Handler) : Определить интерфейс для обработки запросов. При необходимости интерфейс может определить метод для установки и возврата ссылки на следующий интерфейс. Эта роль обычно реализуется абстрактным классом или интерфейсом.
Бетонный манипулятор : после получения запроса конкретный процессор может решить обработать запрос или передать запрос следующей стороне. Поскольку конкретный процессор содержит ссылку на следующий дом, при необходимости он может получить доступ к следующему дому.
Клиентский класс (Клиент): Создайте цепочку обработки и отправьте запрос конкретному объекту процессора головы цепочки.
Модель цепочки ответственности подходит для следующих сценариев:
Несколько объектов совместно обрабатывают задачу: Например, многоуровневая система утверждения передает запрос на утверждение следующему уровню утверждающего в зависимости от его полномочий и уровня до тех пор, пока не будет получен окончательный результат утверждения.
Процесс обработки динамической комбинации: Благодаря гибкой настройке цепочки ответственности объекты обработки можно динамически комбинировать для реализации различных процессов обработки.
Избегайте прямой связи между отправителем и получателем запроса.: передавая запрос в цепочку ответственности, отправителю запроса не нужно знать конкретный объект обработки, что снижает зависимость между объектами.
Модель цепочки ответственности широко используется во многих областях, включая, помимо прочего:
Ниже приведен простой пример реализации шаблона цепочки ответственности, который используется для обработки сообщений журнала и передачи сообщений различным процессорам в соответствии с уровнем журнала (например, DEBUG, INFO, WARN, ERROR):
- // 抽象处理者
- abstract class LogHandler {
- protected int level;
- protected LogHandler nextHandler;
-
- public void setNextHandler(LogHandler nextHandler) {
- this.nextHandler = nextHandler;
- }
-
- //这个是精髓:他除了处理自己的逻辑,还会调用nextHandler进行处理
- public void logMessage(int level, String message) {
- if (this.level <= level) {
- write(message);
- }
- if (nextHandler != null) {
- nextHandler.logMessage(level, message);
- }
- }
-
- abstract protected void write(String message);
- }
-
- // 具体处理者:ErrorLogHandler
- class ErrorLogHandler extends LogHandler {
- public ErrorLogHandler(int level) {
- this.level = level;
- }
-
- @Override
- protected void write(String message) {
- System.out.println("ErrorLogHandler: " + message);
- }
- }
-
- // 具体处理者:WarnLogHandler
- class WarnLogHandler extends LogHandler {
- public WarnLogHandler(int level) {
- this.level = level;
- }
-
- @Override
- protected void write(String message) {
- System.out.println("WarnLogHandler: " + message);
- }
- }
-
- // 具体处理者:InfoLogHandler
- class InfoLogHandler extends LogHandler {
- public InfoLogHandler(int level) {
- this.level = level;
- }
-
- @Override
- protected void write(String message) {
- System.out.println("InfoLogHandler: " + message);
- }
- }
-
- // 客户端代码
- public class ChainPatternDemo {
- private static LogHandler getChainOfLoggers() {
- // 创建链中的处理者
- LogHandler errorLogHandler = new ErrorLogHandler(3);
-
- LogHandler warnLogHandler = new WarnLogHandler(2);
- warnLogHandler.setNextHandler(errorLogHandler);
-
- LogHandler infoLogHandler = new InfoLogHandler(1);
- infoLogHandler.setNextHandler(warnLogHandler);
-
- return infoLogHandler;
- }
-
- public static void main(String[] args) {
- LogHandler loggerChain = getChainOfLoggers();
-
- loggerChain.logMessage(1, "This is an informational message.");
- loggerChain.logMessage(2, "This is a warning message.");
- loggerChain.logMessage(3, "This is an error message.");
- }
- }
В этом примере мы определяем три конкретных класса обработчиков журналов (ErrorLogHandler
、WarnLogHandler
、InfoLogHandler
), они обрабатывают разные уровни сообщений журнала соответственно. Каждый обработчик содержит уровень (level
), используемый для определения необходимости обработки сообщений этого уровня.ПозвонивlogMessage
метод, запрос передается первому обработчику в цепочке (infoLogHandler
), он решает, обрабатывать ли сообщение, исходя из своего собственного уровня и логики обработки, а затем (если не обработан) передает запрос следующему процессору в цепочке. Этот процесс продолжается до конца цепочки или до тех пор, пока запрос не будет обработан.
Обратите внимание, что в реальном приложении вам может потребоватьсяLogHandler
В класс добавлены дополнительные методы и свойства для поддержки более сложной логики и конфигурации обработки журналов. Кроме того, уровни журнала обычно используют перечисления (enum
) вместо целых чисел, чтобы улучшить читаемость и удобство обслуживания кода.
Шаблон цепочки ответственности обеспечивает гибкую обработку запросов и масштабируемость системы за счет соединения нескольких объектов, обрабатывающих запросы, в цепочку и разрешения запросам проходить по цепочке до тех пор, пока объект в цепочке не решит обработать запрос.
Если модель цепочки ответственности вам полезна, не забудьте поставить лайк и сохранить ее.