java實現責任鏈模式的小demo

//一個請假請求
public class LeaveRequest {
    private int leaveDays;

    private String name;

    public void leave(){
        System.out.println("走完了流程都沒人處理我");
    }
    
    //省略getter、setter      
}
//一個請假的處理接口,具體的處理類都要實現這個接口
@FunctionalInterface
public interface LeaveHandler {
    // 直屬主管審批處理的請假天數
    int MIN = 3;

    // 部門經理需要處理的請假天數
    int MIDDLE = 10;

    // 總經理審批
    int MAX = 30;

    void handRequest(LeaveRequest leaveRequest, FilterChain filterChain);
}
//直屬主管處理類
public class SupervisorHandler implements LeaveHandler{

    @Override
    public void handRequest(LeaveRequest leaveRequest, FilterChain filterChain) {
        if (leaveRequest.getLeaveDays() < MIN){
            System.out.println("請假天數" + leaveRequest.getLeaveDays() + "我是直屬主管,我處理了");
            return;
        }
        System.out.println("主管處理不了,下一個");
        filterChain.doFilter();
    }
}

//部門經理處理類
public class DeptManagerHandler implements LeaveHandler{

    @Override
    public void handRequest(LeaveRequest leaveRequest, FilterChain filterChain) {
        if (leaveRequest.getLeaveDays() <= MIDDLE){
            System.out.println("請假天數" + leaveRequest.getLeaveDays() + "我是部門經理,我處理了");
            return;
        }
        System.out.println("經理處理不了,下一個");
        filterChain.doFilter();
    }
}

//總經理處理類
public class GeneralManagerHandler implements LeaveHandler{

    @Override
    public void handRequest(LeaveRequest leaveRequest, FilterChain filterChain) {
        if (leaveRequest.getLeaveDays() <= MAX){
            System.out.println("請假天數" + leaveRequest.getLeaveDays() + "我是總經理,我處理了");
            return;
        }
        System.out.println("總經理處理不了,下一個");
        filterChain.doFilter();
    }
}
//過濾器鏈,把各個處理類串聯起來
public class FilterChain {
    private int index = 0;

    private LeaveRequest leaveRequest;

    private List<LeaveHandler> leaveHandlerList = new ArrayList<LeaveHandler>();

    public FilterChain(LeaveRequest leaveRequest){
        this.leaveRequest = leaveRequest;
    }

    public FilterChain addHandler(LeaveHandler leaveHandler){
        if (null == leaveHandler) return null;
        this.leaveHandlerList.add(leaveHandler);
        return this;
    }

    public void doFilter(){
        if(index == leaveHandlerList.size()) {
            leaveRequest.leave();
            return;
        }
      leaveHandlerList.get(index
++).handRequest(leaveRequest,this); } }
public class Main {
    public static void main(String[] args){
        LeaveRequest leaveRequest = new LeaveRequest(49,"小明");

        FilterChain filterChain = new FilterChain(leaveRequest);

        filterChain.addHandler(new SupervisorHandler())
                   .addHandler(new DeptManagerHandler())
                   .addHandler(new GeneralManagerHandler())
                   //使用lambda表達式創建自定義處理類
                   .addHandler((LeaveRequest request, FilterChain filter) -> {
                       if (request.getLeaveDays() <= 50){
                           System.out.println("請假天數" + request.getLeaveDays() + "我是自定義處理器,我處理了");
                           return;
                       }
                       System.out.println("自定義處理不了,下一個");
                       filter.doFilter();
                   })
                   .doFilter();
    }
}    
輸出:
主管處理不了,下一個
經理處理不了,下一個
總經理處理不了,下一個
請假天數49我是自定義處理器,我處理了

 

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