Chain of Responsibility Pattern က Behaviour Pattern တစ်ခုပါ။ Chain Of Responbility က chain တွေလိုမျိုး အဆင့် တွေ ကို တစ်ခု ပြီး တစ်ခု အလုပ်လုပ်သွားသည့် ပုံစံမျိုးပါ။
အောက်က ပုံလေးကို ကြည့်ကြည့်ပါ။
![](https://cldup.com/RCP_eghoMA.png)
ဒီပုံလေးကို မြင်လိုက်တာ နဲ့ backend developer တွေ ဆိုရင် Middleware ပဲ ဆိုတာ မြင်သွားပါလိမ့်မယ်။ Request တစ်ခု ရောက်လာရင် middleware ခံပြီးတော့ မှန် ခဲ့ ရင် next ကို ခေါ်ခေါ်သွားတာကို သတိရမှာပါ။
backend request ရောက်လာရင် login ဝင်ထားလား။ မှန်ရင် next ။ admin user ဖြစ်လား။ မှန်ရင် next။ ဒီ အတွက် permission ရှိလား မှန်ရင် next နဲ့ သွားပြီးတော့ file response ကို ပြပေးတာပါ။
express မှာ ဆိုရင်
app.use((req, res, next) => {
// do something before the request is handled
next();
});
အဲဒီ code က Chain Of Responsibility pattern ပါပဲ။
Class diagram ကို ကြည့်ရအောင်။
![](https://cldup.com/1mvAqVjOyh.png)
Middleware အတွက် Java နဲ့ Sample ရေးကြည့်ရအောင်။
IMiddleWare.java
public abstract class IMiddleWare {
IMiddleWare nextHandler;
private Request request;
IMiddleWare(IMiddleWare handler) {
this.request = request;
this.nextHandler = handler;
}
public abstract void handle(Request request);
}
AuthHandler.java
public class AuthHandler extends IMiddleWare {
AuthHandler(IMiddleWare handler) {
super(handler);
}
@Override
public void handle(Request request) {
if(request.url.contains("/hello")) {
this.nextHandler.handle(request);
}
else {
System.out.println("Not handling here");
}
}
}
PermissionHandler.java
public class PermissionHandler extends IMiddleWare {
User user;
PermissionHandler(User user, IMiddleWare handler) {
super(handler);
this.user = user;
}
@Override
public void handle(Request request) {
if(this.user.type == UserType.Admin) {
System.out.println("Success");
}
else {
System.out.println("Sorry, You don't have a permission");
}
}
}
MiddleWareHandler.java
public class MiddleWareHandler {
IMiddleWare handler;
public void setHandler(IMiddleWare handler) {
this.handler = handler;
}
public void handle(Request request) {
handler.handle(request);
}
}
Application.java
public class Application {
public static void main(String[] args) {
User user = new User();
user.type = UserType.Admin;
Request request = new Request("http://www.example/hello");
PermissionHandler permissionHandler = new PermissionHandler(user,null);
AuthHandler authHandler = new AuthHandler(permissionHandler);
MiddleWareHandler middleware = new MiddleWareHandler();
middleware.setHandler(authHandler);
middleware.handle(request);
}
}
Code ကို ကြည့်လိုက်လျှင် authHandler က အရင်လာမယ် ပြီးမှ permissionHandler ကို ဆက်သွားပြီး စစ်ပါတယ်။
MiddlewareHandler -> AuthHandler -> PermissionHandler -> Finish
အဲဒီ ပုံစံ သွားမှာပါ။
Code တစ်ခု လုံးရဲ့ Class Diagram ကို ကြည့်ရအောင်။
![](https://cldup.com/Q_KZtFkQLz.png)
Pros and Cons
Single Responsibility ဖြစ်ပါတယ်။ Chain တိုင်းမှာ သူ့ လုပ်ရမယ့် အလုပ်ကို သာ လုပ်ပါတယ်။
Open/Closed Principle ကို follow လုပ်ထားပါတယ်။
မကောင်းတာကတော့ Request တစ်ခုခု က next handling ကို မလုပ်ထားခဲ့ရင် ရပ်သွားမှာပါ။