Java設計模式之責任鏈設計模式

1、概念理解

      舉例說明:一家三輩(兒子,父親,爺爺),去幫助一個一個小學一年級的學生解決一道數學題,這個小學生請求幫助,他就是請求者,兒子先幫忙,兒子不行父親上,父親不行爺爺上,爺爺不行那就gg,小學生這個請求者不知道誰能做出來,這種情況就是責任鏈。

      職責鏈模式(Chain of Responsibility):使多個對象都有機會處理同一個請求,從而避免請求的發送者和接收者之間的耦合關係。將這些對象連成一條鏈,並沿着這條鏈傳遞該請求,直到有一個對象處理它爲止。

2、應用場景

1、我們經常的if else判斷就可以這樣,順序執行可以考慮,我們可以考慮這種模式,當然策略模式也是可以的,
2、公司準備做一個請假制度,孕婦可以請9天,喜事3天,喪事6天等等這種if else的判斷,我們也可以用到責任鏈模式

    不過這種模式一般很少見到,不過有一處我們體會過,Tomcat中的Filter就是使用了責任鏈模式,創建一個Filter除了要在web.xml文件中做相應配置外,還需要實現javax.servlet.Filter接口。

3、代碼實現

public class Level {

    private int level = 0;

    public Level(int level) {
        this.level = level;
    }

    public int getLevel() {
        return level;
    }

    public boolean above(Level level) {
        if(this.level >= level.getLevel()) {
            return true;
        }else {
            return false;
        }
    }
}
public class Request {
    Level level;

    public Request(Level level) {
        System.out.println("開始請求...");
        this.level = level;
    }

    public Level getLevel() {
        return level;
    }
}
public class Response {
    private String message;
    public Response(String message) {
        System.out.println("處理完請求");
        this.message = message;
    }
    public String getMessage() {
        return message;
    }
}
public abstract class Handler {

    private Handler nextHandler = null;

    public void setNextHandler(Handler handler){
        this.nextHandler = handler;
    }

    protected abstract Level getHandlerLevel();

    public abstract Response response(Request request);

    public final Response handlerRequest(Request request){

        Response response = null;

        if (this.getHandlerLevel().above(request.level)){
                response = this.response(request);
        }else {
            if (nextHandler.nextHandler != null){
                response = this.nextHandler.handlerRequest(request);
            }else {
                System.out.println("沒有能夠滿足條件的");
            }
        }
        return response;
    }
}
public class ConcreteHandler1 extends Handler {
    @Override
    protected Level getHandlerLevel() {
        return new Level(1);
    }

    @Override
    public Response response(Request request) {
        System.out.println("該請求由 ConcreteHandler1 處理");
        return new Response("響應結果 1");
    }
}
public class ConcreteHandler2 extends Handler {
    @Override
    protected Level getHandlerLevel() {
        return new Level(2);
    }

    @Override
    public Response response(Request request) {
        System.out.println("該請求由 ConcreteHandler2 處理");
        return new Response("響應結果 2");
    }
}
public class ConcreteHandler3 extends Handler {
    @Override
    protected Level getHandlerLevel() {
        return new Level(3);
    }

    @Override
    public Response response(Request request) {
        System.out.println("該請求由 ConcreteHandler3 處理");
        return new Response("響應結果 3");
    }
}
public class HandlerUtil {

    public static void handle(int level){
        Handler ch1 = new ConcreteHandler1();
        Handler ch2 = new ConcreteHandler2();
        Handler ch3 = new ConcreteHandler3();
        ch1.setNextHandler(ch2);
        ch2.setNextHandler(ch3);

        Response res1 = ch1.handlerRequest(new Request(new Level(level)));
        if (res1 != null) {
            System.out.println(res1.getMessage());
        }
    }
}

      main函數

public class Main {

    public static void main(String[] args){
       HandlerUtil.handle(2);
       System.out.println("-------------");
       HandlerUtil.handle(4);
    }
}

      結果

          

      其實,總感覺還不如用策略模式或者直接寫if else呢,雖然if else的缺點是代碼臃腫,耦合度高,而這個責任鏈設計模式是靈活性比較高,但是寫完這個博客沒感覺出來,大家還是知道有這麼一個模式就好,畢竟你現在有了疑問,將來說不定碰到一個大神,會指點你的。

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