Mybatis中的Plugin是依賴Interceptor
接口實現的,這裏面還用到了責任鏈模式 Chain of responsibility
interceptorChain.addInterceptor(interceptor);
public class InterceptorChain {
private final List<Interceptor> interceptors = new ArrayList<>();
public Object pluginAll(Object target) {
for (Interceptor interceptor : interceptors) {
target = interceptor.plugin(target);
}
return target;
}
public void addInterceptor(Interceptor interceptor) {
interceptors.add(interceptor);
}
}
上面的InterceptorChain
在調用pluginAll
的時候會應用所有的plugin
default Object plugin(Object target) {
return Plugin.wrap(target, this);
}
具體的就是,依次生成JDK dynamic proxy對象,並且將對具體statement的調用應用攔截器,形成調用鏈,及責任鏈模式。
如圖所示
舉個栗子:
# Reviewer基礎類
public abstract class Reviewer {
public Reviewer nextReviewer;
Reviewer addReviewer(Reviewer nextReviewer){
return this.nextReviewer=nextReviewer;
}
abstract void reviewCode(String code);
public void review(String code){
reviewCode(code);
if(nextReviewer!=null){
nextReviewer.review(code);
}
}
}
#幾種實現
public class SelfReview extends Reviewer {
@Override
public void reviewCode(String code) {
System.out.println(code + " \n self review done \n");
}
}
public class PeerReviewer extends Reviewer {
@Override
public void reviewCode(String code) {
System.out.println(code + " \n peer review done \n");
}
}
public class TeamLeadReviewer extends Reviewer {
@Override
public void reviewCode(String code) {
System.out.println(code + "\n team lead review done \n");
}
}
#測試
public static void main(String[] args){
String code = "hello world";
Reviewer selfReviewer = new SelfReview();
Reviewer peerReviewer = new PeerReviewer();
Reviewer teamLeadReviewer = new TeamLeadReviewer();
selfReviewer.addReviewer(peerReviewer);
peerReviewer.addReviewer(teamLeadReviewer);
selfReviewer.review("Hello world");
}
責任鏈的作用很明顯了,解藕,可以在sender和receiver之間添加更多的邏輯