設計模式-責任鏈'Chain Of Responsiblity'

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之間添加更多的邏輯

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章