真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

設(shè)計模式---責(zé)任鏈模式

簡述

將各個功能拆分后分別封裝(各功能解耦),需要時可自由組合(包括執(zhí)行順序)

余杭網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,余杭網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為余杭超過千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)營銷網(wǎng)站建設(shè)要多少錢,請找那個售后服務(wù)好的余杭做網(wǎng)站的公司定做!

話不多說,看個優(yōu)化案例吧。

優(yōu)化案例

最初版

以下是模擬客戶端想服務(wù)端發(fā)送請求的業(yè)務(wù)流程。

客戶端調(diào)用代碼如下。

// 客戶端
public class Client {
    public static void main(String[] args) {
        Map request = new HashMap<>();
        request.put("username", "admin");
        request.put("password", "admin");
        service(request);
    }
    public static void service(Map request) {
        String username = request.get("username");
        String password = request.get("password");
        if (!"admin".equals(username) || !"admin".equals(password)) {
            throw new RuntimeException("用戶名或密碼不正確!");
        }
        System.out.println("用戶認(rèn)證通過。");
        System.out.println("正在處理請求的業(yè)務(wù)。");
    }
}

如果根據(jù)新的需求,需要在用戶認(rèn)證通過到處理請求的業(yè)務(wù)之間增加一個緩存用戶信息至Session的處理該怎么辦,傳統(tǒng)的寫法肯定是直接在上述代碼的第14行后加入一條緩存用戶信息的處理,但這樣下去,以后每次增加這部分的需求是都無一例外的需要修改客戶端的代碼,并且實際上客戶端發(fā)送請求的方法肯定不止一處,如果有一個新業(yè)務(wù)是需要在每個請求的方法中都添加呢。那又怎么辦?現(xiàn)在上面的代碼只是模擬,所以只需要加一行打印輸出即可,真實的邏輯可比這復(fù)雜得多,到時候的代碼量也是現(xiàn)在的好幾倍,豈不麻煩死了?

為了解決這個問題,我們可以使用責(zé)任鏈模式。

修改版v1

增加一組類,使用責(zé)任鏈模式。如下。

// 責(zé)任鏈的頂級接口
// 定義責(zé)任鏈的核心功能
public interface Chain {
    // 指定下一個處理
    void setNext(Chain next);
    // 處理當(dāng)前請求
    void handler(Map request);
}
// 責(zé)任鏈的抽象父類
// 定義所有責(zé)任鏈對象共通的屬性和方法
public abstract class AbstractChain implements Chain {
    // 持有下一個處理
    private Chain next;
    public Chain getNext() {
        return next;
    }
    @Override
    public void setNext(Chain next) {
        this.next = next;
    }
}
// 用戶認(rèn)證模塊
public class AuthChain extends AbstractChain {
    @Override
    public void handler(Map request) {
        String username = request.get("username");
        String password = request.get("password");
        if (!"admin".equals(username) || !"admin".equals(password)) {
            throw new RuntimeException("用戶名或密碼不正確!");
        }
        System.out.println("用戶認(rèn)證通過。");
        Chain next = this.getNext();
        if (next == null) {
            throw new RuntimeException("處理中斷!");
        }
        next.handler(request);
    }
}
// Session緩存模塊
public class SessionChain extends AbstractChain {
    @Override
    public void handler(Map request) {
        System.out.println("緩存用戶信息至Session。");
        Chain next = this.getNext();
        if (next == null) {
            throw new RuntimeException("處理中斷!");
        }
        next.handler(request);
    }
}
// 業(yè)務(wù)處理模塊
public class ProcessChain extends AbstractChain {
    @Override
    public void handler(Map request) {
        System.out.println("正在處理請求的業(yè)務(wù)。");
    }
}

修改后,客戶端代碼的調(diào)用如下。

public class Client {
    public static void main(String[] args) {
        Map request = new HashMap<>();
        request.put("username", "admin");
        request.put("password", "admin");
        service(request);
    }
    public static void service(Map request) {
        Chain auth = new AuthChain();
        Chain session = new SessionChain();
        Chain process = new ProcessChain();
        auth.setNext(session);
        session.setNext(process);
        auth.handler(request);
    }
}

熟悉數(shù)據(jù)結(jié)構(gòu)的同學(xué)肯定一眼就看出了責(zé)任鏈模式的本質(zhì):鏈表。將一個冗長的業(yè)務(wù)處理流程拆分成各個模塊,使用時根據(jù)業(yè)務(wù)流程以鏈表的形式將其串聯(lián)。不僅提升了各個模塊代碼的復(fù)用性,而且還能是的各個模塊自由組合,極大的提升了開發(fā)效率。

總結(jié)

優(yōu)點

  • 可以自由指定各個模塊的執(zhí)行順序。
  • 各個模塊遵循單一職責(zé)使得各個模塊間解耦。
  • 新增業(yè)務(wù)流程時只需要增加新的模塊即可,遵循開閉原則,提升了系統(tǒng)的可維護(hù)性。

缺點

  • 當(dāng)業(yè)務(wù)流程過長時,組成的業(yè)務(wù)鏈也會非常的長,涉及到的對象過多可能會影響系統(tǒng)的性能。
  • 雖然各個模塊可以自由組合,但是組合的工作實際上都放在了客戶端,這無疑提升了客戶端的代碼復(fù)雜度。

適用場景

  • 業(yè)務(wù)流程類的功能都可以使用責(zé)任鏈模式。
    • 公司或政府部門各級對于文件的審批,需要各級各部門蓋章簽字,并且其中一環(huán)未通過就得打回重新審核。

文章名稱:設(shè)計模式---責(zé)任鏈模式
當(dāng)前路徑:http://weahome.cn/article/dsoioci.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部