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.
