----- На следующий день -----
————————————
В компании есть три программиста, и их зовут Сяо А, Сяо Б и Сяо С:
Однажды у нового менеджера по продукту компании появилось новое требование, но она не знает, кто должен нести ответственность за это требование. Итак, она впервые нашла маленького А:
Итак, продакт-менеджер снова нашел маленькую Б:
Итак, продакт-менеджер снова нашел маленькую С:
Таким образом, задача передается от маленькой A к маленькой B, от маленькой B к маленькой C и, наконец, обрабатывается маленькой C, образуя полную цепочку обработки задач:
В приведенной выше цепочке есть разные обработчики задач. Столкнувшись с новой задачей, каждый обработчик задачи должен оценить, может ли он справиться с задачей, если может, то обработать ее и вернуться; если она не может быть обработана, она будет передана следующему обработчику задачи до тех пор, пока определенный обработчик задачи окончательно завершена. ЭтоСхема цепочки ответственностиосновная идея.
abstract public class Handler {
protected Handler successor;
public void setSuccessor(Handler successor) {
this.successor = successor;
}
abstract String handleRequest(String msg);
}
Как видно из приведенного выше абстрактного класса, каждый объект Handler содержит элемент-преемник, который указывает на его следующий обработчик задачи, точно так же, как следующий указатель узла связанного списка.
public class HandlerA extends Handler {
@Override
String handleRequest(String msg) {
if(msg.contains("a")){
msg = msg.replace('a', '*');
} else if(this.successor != null){
msg = this.successor.handleRequest(msg);
}
return msg;
}
}
public class HandlerB extends Handler {
@Override
String handleRequest(String msg) {
if(msg.contains("b")){
msg = msg.replace('b', '*');
} else if(this.successor != null){
msg = this.successor.handleRequest(msg);
}
return msg;
}
}
public class HandlerC extends Handler {
@Override
String handleRequest(String msg) {
if(msg.contains("c")){
msg = msg.replace('c', '*');
} else if(this.successor != null){
msg = this.successor.handleRequest(msg);
}
return msg;
}
}
В этих трех классах реализации Handler выносятся аналогичные суждения:
Если строка входящего сообщения содержит определенную букву, замените соответствующую букву на *. Как только обработчик заменяет букву, за которую он отвечает, он сразу завершает всю ссылку; если нет буквы, за которую он отвечает, укажите следующий обработчик для продолжения обработки.
public class Client {
public static void main(String[] args) {
Handler handlerA = new HandlerA();
Handler handlerB = new HandlerB();
Handler handlerC = new HandlerC();
handlerA.setSuccessor(handlerB);
handlerB.setSuccessor(handlerC);
System.out.println(handlerA.handleRequest("apple"));
System.out.println(handlerA.handleRequest("bicycle"));
System.out.println(handlerA.handleRequest("color"));
}
}
В клиентском коде можно гибко задавать порядок всей ссылки и обработчика, а затем напрямую вызывать метод handleRequest первого обработчика, что эквивалентно запуску всей ссылки.
Любой, кто занимался веб-разработкой, знает, что когда клиент отправляет HTTP-запрос веб-приложению, он сначала проходит через уровни контейнера Tomcat.Фильтр, фильтр проверит и отфильтрует запрошенные права доступа, допустимость параметров и т. д.
Реализация этого послойного фильтра использует шаблон цепочки ответственности.
Те, кто знаком с исходным кодом фреймворка SpringMVC, должны знать, что после того, как HTTP-запрос клиента достигнет веб-приложения, он будет обработан фреймворком SpringMVC.DispatcherServletКлассы распределяются и распределяются по конкретным методам уровня контроллера.
Перед входом в бизнес-логику уровня контроллера и после выполнения бизнес-логики запрос будет проходить через сериюПерехватчик. Поток обработки этой серии перехватчиков также является реализацией шаблона цепочки ответственности.
Друзья, которым понравилась эта статья, приглашаем обратить внимание на номер пабликапрограммист маленький серый, смотрите больше захватывающего контента