Шаблоны комического дизайна: что такое «шаблон цепочки ответственности»?

Java Шаблоны проектирования

漫画设计模式:什么是“职责链模式”?

漫画设计模式:什么是“职责链模式”?

----- На следующий день -----

漫画设计模式:什么是“职责链模式”?

漫画设计模式:什么是“职责链模式”?

漫画设计模式:什么是“职责链模式”?

漫画设计模式:什么是“职责链模式”?

漫画设计模式:什么是“职责链模式”?

漫画设计模式:什么是“职责链模式”?

漫画设计模式:什么是“职责链模式”?

漫画设计模式:什么是“职责链模式”?

————————————

漫画设计模式:什么是“职责链模式”?

漫画设计模式:什么是“职责链模式”?

漫画设计模式:什么是“职责链模式”?

漫画设计模式:什么是“职责链模式”?

В компании есть три программиста, и их зовут Сяо А, Сяо Б и Сяо С:

漫画设计模式:什么是“职责链模式”?

Однажды у нового менеджера по продукту компании появилось новое требование, но она не знает, кто должен нести ответственность за это требование. Итак, она впервые нашла маленького А:

漫画设计模式:什么是“职责链模式”?

漫画设计模式:什么是“职责链模式”?

Итак, продакт-менеджер снова нашел маленькую Б:

漫画设计模式:什么是“职责链模式”?

漫画设计模式:什么是“职责链模式”?

Итак, продакт-менеджер снова нашел маленькую С:

漫画设计模式:什么是“职责链模式”?

漫画设计模式:什么是“职责链模式”?

Таким образом, задача передается от маленькой 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Классы распределяются и распределяются по конкретным методам уровня контроллера.

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

漫画设计模式:什么是“职责链模式”?

Друзья, которым понравилась эта статья, приглашаем обратить внимание на номер пабликапрограммист маленький серый, смотрите больше захватывающего контента