12. Режим цепочки ответственности.

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

Диаграмма классов

 

Пример кода

1.	class Level {  
2.	    private int level = 0;  
3.	    public Level(int level){  
4.	        this.level = level;  
5.	    };  
6.	      
7.	    public boolean above(Level level){  
8.	        if(this.level >= level.level){  
9.	            return true;  
10.	        }  
11.	        return false;  
12.	    }  
13.	}  
14.	  
15.	class Request {  
16.	    Level level;  
17.	    public Request(Level level){  
18.	        this.level = level;  
19.	    }  
20.	      
21.	    public Level getLevel(){  
22.	        return level;  
23.	    }  
24.	}  
25.	  
26.	class Response {  
27.	  
28.	}  

Обработчик:

1.	abstract class Handler {  
2.	    private Handler nextHandler;      
3.	    public final Response handleRequest(Request request){  
4.	        Response response = null;  
5.	          
6.	        if(this.getHandlerLevel().above(request.getLevel())){  
7.	            response = this.response(request);  
8.	        }else{  
9.	            if(this.nextHandler != null){  
10.	                this.nextHandler.handleRequest(request);  
11.	            }else{  
12.	                System.out.println("-----没有合适的处理器-----");  
13.	            }  
14.	        }  
15.	        return response;  
16.	    }  
17.	    public void setNextHandler(Handler handler){  
18.	        this.nextHandler = handler;  
19.	    }  
20.	    protected abstract Level getHandlerLevel();  
21.	    public abstract Response response(Request request);  
22.	}  

ConcreteHandler:

 

1.	class ConcreteHandler1 extends Handler {  
2.	    protected Level getHandlerLevel() {  
3.	        return new Level(1);  
4.	    }  
5.	    public Response response(Request request) {  
6.	        System.out.println("-----请求由处理器1进行处理-----");  
7.	        return null;  
8.	    }  
9.	}  
10.	  
11.	class ConcreteHandler2 extends Handler {  
12.	    protected Level getHandlerLevel() {  
13.	        return new Level(3);  
14.	    }  
15.	    public Response response(Request request) {  
16.	        System.out.println("-----请求由处理器2进行处理-----");  
17.	        return null;  
18.	    }  
19.	}  
20.	  
21.	class ConcreteHandler3 extends Handler {  
22.	    protected Level getHandlerLevel() {  
23.	        return new Level(5);  
24.	    }  
25.	    public Response response(Request request) {  
26.	        System.out.println("-----请求由处理器3进行处理-----");  
27.	        return null;  
28.	    }  
29.	}  

клиент:

1.	public class Client {  
2.	    public static void main(String[] args){  
3.	        Handler handler1 = new ConcreteHandler1();  
4.	        Handler handler2 = new ConcreteHandler2();  
5.	        Handler handler3 = new ConcreteHandler3();  
6.	  
7.	        handler1.setNextHandler(handler2);  
8.	        handler2.setNextHandler(handler3);  
9.	          
10.	       Response response = handler1.handleRequest(new Request(new Level(4)));  
11.	    }  
     } 

Структура модели цепочки ответственности

Диаграмма классов схемы подключения ответственности очень проста и состоит из абстрактного класса обработки и набора классов реализации:

  • Абстрактный класс обработки: абстрактный класс обработки в основном содержит переменную-член nextHandler, указывающую на следующий класс обработки, и метод handRequest для обработки запроса. Основная идея метода handRequest заключается в том, что при выполнении условий обработки этот класс обработки будет использоваться для обработки , В противном случае это обрабатывается nextHandler.
  • Особая категория обработки: особая категория обработки в основном предназначена для реализации конкретной логики обработки и соответствующих условий обработки.

Преимущества и недостатки модели цепочки ответственности

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

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

Сценарии использования режима цепочки ответственности

Как и в первом примере, если вы чувствуете себя бессильным при использовании оператора if ... else ... для организации цепочки ответственности, а код выглядит плохо, вы можете использовать шаблон цепочки ответственности для рефакторинга.

подводить итоги

Модель цепочки ответственности на самом деле является гибкой версией оператора if ... else ..., который помещает эти операторы условий суждения в каждый класс обработки. Преимущество этого состоит в том, что она более гибкая, но также сопряжена с рисками, такими как обработка настроек Имея дело с контекстом класса, вы должны быть очень осторожны, чтобы иметь дело с условными отношениями суждения логики до и после класса, и будьте осторожны, чтобы не иметь циклических ссылок в цепочке.

 

рекомендация

отblog.csdn.net/sinat_37138973/article/details/88635949