天天看點

java設計模式-責任鍊模式一:定義二:優缺點三:代碼

java設計模式-責任鍊模式

  • 一:定義
  • 二:優缺點
    • 優點
    • 缺點
  • 三:代碼
    • 代碼實作
    • 執行結果
    • 其它實作

一:定義

對一個請求有多個對象去處理,處理對象包含了對另一個對象的引用,串行去處理,相當于形成了一個處理鍊,這種設計模式屬于行為模式。

實作方式可以通過連結清單或者數組實作。

二:優缺點

優點

1.請求的發送者和接受者解耦

客戶隻需要将請求發送到責任鍊上即可,無須關心請求的處理細節和請求的傳遞過程,請求會自動進行傳遞

2.可以控制執行順序

3.符合開閉原則和單一職責原則

單一原則:就是一個類隻負責一項職責

開閉原則:對擴充是開放的,而對修改是封閉的,這樣避免修改代碼帶來的風險

缺點

1.串行化執行處理,系統性能會受一定影響。

2.代碼有可能循環調用,調試有一定的不便,即子類都調用父類的方法。

三:代碼

代碼實作

我們公司是做交易人員名稱比對的,将業務場景簡化後,大緻邏輯是交易人員請求資訊過來後,要經過關鍵字檢索、白名單檢索、黑名單檢索,如果命中人員資訊比對庫的話,将傳回,代碼實作如下:

1.人員資訊封裝類,request

2.抽象處理類:Handler 。

3.具體處理類,繼承Handler:CheckBlackListHandler(黑名單處理類) 、CheckKeyListHandler(關鍵字處理類) 、CheckWhiteListHandler (白名單處理類)。

4.客戶類(Client)角色:ChainOfResponsibilityPattern(建立處理鍊,并将請求發送給處理鍊的第一個對象處理)

package com.dongya.chainofresponsibility;

/**
 * To do
 *
 * @author dongzhen
 * @date 2021/7/3 22:00
 */
public class ChainOfResponsibilityPattern {
    public static void main(String[] args) {
        CheckBlackListHandler checkBlackListHandler = new CheckBlackListHandler();
        CheckKeyListHandler checkKeyListHandler = new CheckKeyListHandler();
        CheckWhiteListHandler checkWhiteListHandler = new CheckWhiteListHandler();
        Request request = new Request();
        checkKeyListHandler.setNext(checkWhiteListHandler);
        checkWhiteListHandler.setNext(checkBlackListHandler);
        checkKeyListHandler.checkRule(request);


    }
}

/**
 * 請求類
 *
 * @author dongzhen
 * @date 2021/7/3 22:00
 */
class Request {
    public boolean hitKeyFlag;
    public boolean hitWhiteFlag;
    public boolean hitBlackFlag;

}

/**
 * 請求處理類
 *
 * @author dongzhen
 * @date 2021/7/3 22:00
 */
abstract class Handler {
    public static final boolean HIT_TRUE = true;
    public static final boolean HIT_FALSE = false;

    protected Handler next;

    public Handler getNext() {
        return next;
    }

    public void setNext(Handler next) {
        this.next = next;
    }

    public void checkRule(Request request) {

    }
}

/**
 * 校驗黑名單處理類
 *
 * @author dongzhen
 * @date 2021/7/3 22:00
 */
class CheckBlackListHandler extends Handler {
    @Override
    public void checkRule(Request request) {
        System.out.println("check black begin!");
        if (HIT_TRUE == request.hitBlackFlag) {
            System.out.println("hit black!");
            return;
        } else if (next != null) {
            System.out.println("not hit black,check next rule");
            next.checkRule(request);
        } else {
            System.out.println("this is the last one,no rule to check");
        }
    }
}

/**
 * 校驗關鍵字處理類
 *
 * @author dongzhen
 * @date 2021/7/3 22:00
 */
class CheckKeyListHandler extends Handler {
    @Override
    public void checkRule(Request request) {
        System.out.println("check key begin!");
        if (HIT_TRUE == request.hitKeyFlag) {
            System.out.println("hit key!");
            return;
        } else if (next != null) {
            System.out.println("not hit key,check next rule");
            next.checkRule(request);
        } else {
            System.out.println("this is the last one,no rule to check");
        }
    }
}

/**
 * 校驗白名單處理類
 *
 * @author dongzhen
 * @date 2021/7/3 22:00
 */
class CheckWhiteListHandler extends Handler {
    @Override
    public void checkRule(Request request) {
        System.out.println("check white begin!");
        if (HIT_TRUE == request.hitWhiteFlag) {
            System.out.println("hit white!");
            return;
        } else if (next != null) {
            System.out.println("not hit white,check next rule");
            next.checkRule(request);
        } else {
            System.out.println("this is the last one,no rule to check");
        }
    }
}


           

執行結果

check key begin!
not hit key,check next rule
check white begin!
not hit white,check next rule
check black begin!
this is the last one,no rule to check

           

其它實作

還有 Struts2 的攔截器、JSP 和 Servlet 的 Filter 等