Latest web development tutorials

Цепочка обязанностей

Как следует из названия, цепочка обязанностей (цепочка обязанностей) для запроса, чтобы создать цепочку объекта приемника. Этот тип образца дается запрос, отправитель и получатель запроса развязкой. Этот тип шаблонов проектирования относятся поведенческие модели.

В этом режиме, каждый получатель обычно содержит ссылку на другой получателю. Если объект не может обработать запрос, то он будет с такой же просьбой к следующему получателю, и так далее.

введение

Намерение: Избегайте запроса отправитель и получатель соединены друг с другом таким образом , что несколько объектов могут принимать запросы, эти объекты будут соединены в цепочку, и передать запрос по цепочке , пока объект не обрабатывает его до сих пор.

Процессор долг цепь отвечает за обработку запросов, клиентам нужно всего лишь отправить запрос на цепочке ответственности могут, не должны касаться деталей обработки передачи запроса и запросов, поэтому цепь ответственности и запросзапроса отправителя: основное решение развязаны.

Когда использовать: когда имеешь дело с большим количеством дороги для фильтрации сообщений.

Как исправить: классы по перехвату реализовать единый интерфейс.

Код ключа: Обработчик внутри самой полимеризации, в HanleRequest где это уместно , чтобы определить , если будут приняты условия вниз не вверх, независимо от того, перед которым перешел в набор.

Примеры применения: 1, Сон Красный особняки "Барабанящий проход потратить."2, JS события пузырится. 3, JAVA WEB Кодирование в Apache Tomcat для обработки, Struts2 перехватчика, Фильтр Jsp сервлета.

Преимущества: 1, уменьшить сцепление.Он просит отправителя и получателя развязку. 2, упрощенный объект. Так что объекты не должны знать структуру цепи. 3, в целях повышения гибкости объекта возложенных на него обязанностей. Изменяя членов цепи или мобилизовать их порядок, позволяя динамическое добавлять или удалять ответственность. 4, добавить новый класс обработчик запросов очень удобно.

Недостатки: 1, не может гарантировать , что запрос должен быть получен.2, производительность системы будет затронута, но менее удобно при отладке кода может вызвать вызова цикла. 3, не могут быть легко наблюдаемые характеристики отладки во время выполнения Hinder.

Сценарии использования: 1, более одного объекта может обрабатывать один и тот же запрос, в частности , какой объект для обработки запроса автоматически определяется временем выполнения.2, без явного указания получателя для отправки запроса на множество объектов. 3, множество объектов может быть динамически назначается для обработки запроса.

Примечание: встречается во многих приложениях в Java Web.

реализация

Мы создаем абстрактный классAbstractLogger,с подробным уровня ведения журнала. Затем мы создаем три типа регистраторов вытянутыAbstractLogger.Каждый уровень регистратор сообщений является ли их собственный уровень, если он затем распечатывается соответствующим образом, в противном случае он не будет печатать сообщение к следующему и записывающее устройство.

Цепочка обязанностей UML диаграммы

Шаг 1

Создание абстрактной записи класса.

AbstractLogger.java

общественного абстрактного класса AbstractLogger {
   открытые статические INT INFO = 1;
   открытые статические INT DEBUG = 2;
   открытые статические INT ERROR = 3;

   защищенный уровень INT;

   // Цепь ответственности в следующий элемент защищен AbstractLogger nextLogger;

   общественного недействительными setNextLogger (AbstractLogger nextLogger) {
      this.nextLogger = nextLogger;
   }

   общественного недействительными СообщениеЖурнала (уровень INT, String сообщение) {
      если (this.level <= уровень) {
         написать (сообщение);
      }
      если (nextLogger! = NULL) {
         nextLogger.logMessage (уровень, сообщение);
      }
   }

   абстрактные защищенные недействительными записи (String сообщение);
	
}

Шаг 2

Создание классов сущностей, которые расширяют класс записи.

ConsoleLogger.java

Открытый класс ConsoleLogger расширяет AbstractLogger {

   общественного ConsoleLogger (уровень INT) {
      this.level = уровень;
   }

   @Override
   защищенный от записи недействительным (String сообщение) {		
      System.out.println ( "стандартной консоли :: Logger:" + сообщение);
   }
}

ErrorLogger.java

Открытый класс ErrorLogger расширяет AbstractLogger {

   общественного ErrorLogger (уровень INT) {
      this.level = уровень;
   }

   @Override
   защищенный от записи недействительным (String сообщение) {		
      System.out.println ( "Консоль ошибок :: Logger:" + сообщение);
   }
}

FileLogger.java

Открытый класс FileLogger расширяет AbstractLogger {

   общественного FileLogger (уровень INT) {
      this.level = уровень;
   }

   @Override
   защищенный от записи недействительным (String сообщение) {		
      System.out.println ( "File :: Logger:" + сообщение);
   }
}

Шаг 3

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

ChainPatternDemo.java

Открытый класс ChainPatternDemo {
	
   частные статические getChainOfLoggers AbstractLogger () {

      AbstractLogger errorLogger = новый ErrorLogger (AbstractLogger.ERROR);
      AbstractLogger FileLogger = новый FileLogger (AbstractLogger.DEBUG);
      AbstractLogger consoleLogger = новый ConsoleLogger (AbstractLogger.INFO);

      errorLogger.setNextLogger (FileLogger);
      fileLogger.setNextLogger (consoleLogger);

      вернуть errorLogger;	
   }

   государственной статической силы основных (String []) {агдз
      AbstractLogger loggerChain = getChainOfLoggers ();

      loggerChain.logMessage (AbstractLogger.INFO, 
         "Это информация.");

      loggerChain.logMessage (AbstractLogger.DEBUG, 
         "Это информация об уровне отладки.");

      loggerChain.logMessage (AbstractLogger.ERROR, 
         "Это информация об ошибке.");
   }
}

Шаг 4

Проверьте выход.

Стандартной консоли :: Logger: Это информация.
File :: Logger: Это информационный уровень отладки.
Стандартной консоли :: Logger: Это информационный уровень отладки.
Консоль ошибок :: Logger: Это информация об ошибке.
File :: Logger: Это информация об ошибке.
Стандартной консоли :: Logger: Это информация об ошибке.