Behavioral_Chain Of Responsibility
โ
use the handler chain to handle request
- client will only make request to the
Interface Handler - inside the
chain of concrete handlers, it will handle the request - ๐๐ป client will not know the logic behind request
even if logic changes, client does not have to be modified
๐๐ป
client(the class that makes the request)and therequest handleris decoupled- the handler will
- 1๏ธโฃ handle the request
2๏ธโฃ pass it to the next handler in the chain
- ๐๐ป difficult to debug, we do not know in which handler the error is occuring
๐ Chain of Responsibility
- abstract class
Request Handler - class
PrintRequestHandler,LoggingRequestHandler,AuthRequestHandlerextendsRequest Handler - ๐๐ปโโ๏ธ Client: I want my request to be 1๏ธโฃ check authentication, if ok 2๏ธโฃ then log 3๏ธโฃ then print
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//step 1. Abstract class Request Handler
public abstract class RequestHandler {
private RequestHandler nextHandler; //create chain of handlers
public RequestHandler(RequestHandler nextHandler) {
this.nextHandler = nextHandler;
}
public void handle(Request request){
if(nextHandler != null){ //if next handler exsits
nextHandler.handle(request); //call next handler
}
}
}
//step 2. create all the concrete handlers
public class AuthRequestHandler extends RequestHandler{
public AuthRequestHandler(RequestHandler nextHandler) {
super(nextHandler);
}
@Override
public void handle(Request request) {
System.out.println("Check authentication");
super.handle(request);
}
}
public class LoggingRequestHandler extends RequestHandler{
//handle logic
}
public class PrintRequestHandler extends RequestHandler{
//handle logic
}
- client code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Client {
private RequestHandler requestHandler;
public Client(RequestHandler requestHandler) {
this.requestHandler = requestHandler;
}
public void doWork(){
Request request = new Request("Hello request");
requestHandler.handle(request); //client does not know what the handler will do
}
public static void main(String[] args) {
//create chain of handlers
RequestHandler chain = new AuthRequestHandler(new LoggingRequestHandler(new PrintRequestHandler(null)));
Client client = new Client(chain);
client.doWork();
}
}
- result
1
2
3
4
5
Check authentication
Logging
Hello request
AuthRequestHandler ๐๐ป LoggingRequestHandler ๐๐ป PrintRequestHandler
๐ Simple example
- logger class
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//step 1. Logger class(handler)
abstract class Logger {
protected int level;
protected Logger nextLogger;
public void setNextLogger(Logger nextLogger){
this.nextLogger = nextLogger;
}
public void logMessage(int level, String message){
}
protected abstract void write(String message);
}
//step 2. concrete handlers
class ConsoleLogger extends Logger {
}
class ErrorLogger extends Logger {
}
1
2
3
4
5
6
7
8
9
10
11
12
13
//step 3. create the chain
public class Main {
public static void main(String[] args) {
Logger errorLogger = new ErrorLogger(Logger.ERROR);
Logger consoleLogger = new ConsoleLogger(Logger.INFO);
errorLogger.setNextLogger(consoleLogger);
errorLogger.logMessage(Logger.INFO, "This is an info message.");
errorLogger.logMessage(Logger.ERROR, "This is an error message.");
}
}
- client sends reqeust to
errorLogger errorLoggercallsconsoleLogger
๐ ๏ธ
- ๐ servlet filter
@WebFilter๋ฅผ ์ถ๊ฐํ์ฌ/hellocontroller์ ๋ค์ด์ค๊ธฐ ์ ์ ๋ฏธ๋ฆฌ servelet component scan filter๋ฅผ ๊ฑฐ์น์ธ์
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// "/hello" ์ ์ ์ด WebFilter๋ฅผ ๊ฑฐ์ณ๋ผ
@WebFilter(urlPatterns = "/hello")
public class MyFilter implements Filter{
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException{
chain.doFilter(request, response);
}
}
//controller code
@RestController
public class HelloController{
@GetMapping("/hello")
public String hello(){
return "hello";
}
}
- ๐ Security config
- create filter chain
- to
http.autorizeRequest().anyRequest().permitAll().addFilter()...
โ
1๏ธโฃ
2๏ธโฃ
3๏ธโฃ
4๏ธโฃ
- 1๏ธโฃ
- 2๏ธโฃ
- 3๏ธโฃ
- 4๏ธโฃ ๐๐ป ๐๐ป
1
2
3
โญ๏ธโญ๏ธโญ๏ธ EXAM โญ๏ธโญ๏ธโญ๏ธ
โ
๐๐ป
This post is licensed under CC BY 4.0 by the author.
