偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

責任鏈模式在王者榮耀中的應用,妙??!

開發(fā) 前端
光說不練假把式,咱這就用 Java 代碼把剛才李白放大招的邏輯寫出來。放心,代碼里全是王者術語,注釋比代碼還多,保證你看得懂。

兄弟們,大家有沒有過這種經(jīng)歷,玩李白想秀個大招,結果按下去沒反應,定睛一看:要么藍條空了,要么被動沒疊出來,要么還在冷卻,最氣的是,明明啥都好,結果被對面張良一個大招控到動不了?

你以為這只是 “手殘” 或者 “運氣差”?nonono,這里面藏著咱們 Java 程序員最熟悉的設計模式之一 ——責任鏈模式!今天咱就用王者榮耀當例子,把責任鏈模式掰開揉碎了講,保證你看得懂、記得住,還能在隊友面前裝個 “技術逼”。

一、先嘮嘮:啥是責任鏈模式?

先別慌著上代碼,咱先把概念說明白。責任鏈模式這東西,說穿了就是 “排隊辦事”,跟你在王者峽谷里 “排隊等復活” 有點像,但比復活有用多了。

舉個生活里的例子:你去公司報銷差旅費,得先找部門經(jīng)理簽字(他看金額合不合理),經(jīng)理簽完找財務(財務看發(fā)票對不對),財務看完找老板(老板看超沒超預算)—— 這就是一條 “報銷責任鏈”,一件事(報銷)沿著鏈條傳,每個環(huán)節(jié)(經(jīng)理、財務、老板)都管自己的事兒,管完了傳給下一個,直到事兒辦完,或者某個環(huán)節(jié)說 “這事兒我管不了 / 不能辦”。

放到技術里,責任鏈模式的核心就是:定義一系列 “處理器”,讓請求沿著處理器鏈條傳遞,直到有一個處理器能處理它,或者鏈條走完。

再對應到王者里剛才的李白放大招場景:李白放 “青蓮劍歌”(大招),就是一個 “請求”,而 “檢查藍量”“檢查冷卻”“檢查被動”“檢查是否被控”,就是四個 “處理器”,這四個處理器排成一隊,逐個檢查:

  1. 藍量處理器:“兄弟,有藍嗎?沒藍我可不讓過??!”—— 有藍,過;沒藍,打回原形。
  2. 冷卻處理器:“藍夠了?行,冷卻好了沒?沒好再等等!”—— 好了,過;沒好,打回原形。
  3. 被動處理器:“冷卻也夠了?那被動疊滿 4 下了嗎?沒疊滿放不了大招啊!”—— 滿了,過;沒滿,打回原形。
  4. 控制處理器:“都齊了?等等,你是不是被張良控了?被控了按啥都沒用!”—— 沒被控,過;被控了,打回原形。

只有這四個處理器都 “放行”,李白的大招才能放出來。你看,這不就是標準的責任鏈模式嘛!

咱們再把責任鏈模式的核心角色用王者術語翻譯一下,這樣你記起來更方便:

設計模式角色

王者場景對應

作用說明

抽象處理器(Handler)

“技能釋放檢查器” 接口

規(guī)定每個檢查環(huán)節(jié)要做啥(比如 “檢查某個條件”),還要能指定下一個檢查器

具體處理器(ConcreteHandler)

藍量檢查器、冷卻檢查器等

具體干活的,比如真的去看藍夠不夠、冷卻好沒好

客戶端(Client)

李白(或者說玩家操作李白)

發(fā)起請求(“我要放大招”),把請求傳給責任鏈的第一個處理器

二、上代碼!用 Java 實現(xiàn) “李白放大招” 責任鏈

光說不練假把式,咱這就用 Java 代碼把剛才李白放大招的邏輯寫出來。放心,代碼里全是王者術語,注釋比代碼還多,保證你看得懂。

第一步:定義 “技能請求” 實體類

首先,得有個 “請求” 對象,里面裝著李白放大招需要的關鍵信息:英雄是誰、要放啥技能、當前藍量、技能冷卻時間、被動層數(shù)、是否被控。

/**
 * 技能釋放請求(就像你按大招時,游戲收到的指令)
 */
public class SkillRequest {
    // 英雄名稱(比如“李白”)
    private String heroName;
    // 技能名稱(比如“青蓮劍歌”)
    private String skillName;
    // 當前藍量
    private int currentMana;
    // 技能所需藍量
    private int manaCost;
    // 技能當前冷卻時間(0表示冷卻好)
    private int currentCd;
    // 被動層數(shù)(李白大招需要4層)
    private int passiveStack;
    // 是否被控制(true=被控,放不了技能)
    private boolean isControlled;
    // 構造方法、getter、setter咱就不寫全了,省點篇幅,實際開發(fā)要寫哈
    // 這里給個構造方法方便測試
    public SkillRequest(String heroName, String skillName, int currentMana, int manaCost, int currentCd, int passiveStack, boolean isControlled) {
        this.heroName = heroName;
        this.skillName = skillName;
        this.currentMana = currentMana;
        this.manaCost = manaCost;
        this.currentCd = currentCd;
        this.passiveStack = passiveStack;
        this.isControlled = isControlled;
    }
    // getter和setter...(實際開發(fā)中用Lombok的@Data注解更方便,咱這里就不炫技了)
}

第二步:定義抽象處理器(Handler)

接下來,定義一個抽象的 “技能檢查器”,所有具體的檢查器(藍量、冷卻等)都要繼承它。這里核心要做兩件事:1. 處理請求的方法;2. 持有下一個檢查器的引用(形成 “鏈”)。

/**
 * 抽象技能檢查器(責任鏈的“鏈節(jié)點”模板)
 */
public abstract class SkillHandler {
    // 下一個檢查器(比如藍量檢查完,傳給冷卻檢查)
    protected SkillHandler nextHandler;
    // 設置下一個檢查器(鏈式調用的關鍵)
    public void setNextHandler(SkillHandler nextHandler) {
        this.nextHandler = nextHandler;
    }
    /**
     * 處理技能請求的核心方法
     * @param request 技能釋放請求
     * @return 處理結果(比如“大招釋放成功”或“藍量不足,無法釋放”)
     */
    public abstract String handle(SkillRequest request);
    /**
     * 工具方法:如果有下一個檢查器,就把請求傳下去
     * 不用每個具體處理器都寫一遍,這里封裝一下
     */
    protected String passToNext(SkillRequest request) {
        if (nextHandler != null) {
            return nextHandler.handle(request);
        }
        // 如果沒有下一個檢查器,說明所有檢查都通過了
        return request.getHeroName() + "的" + request.getSkillName() + "釋放成功!秀起來!";
    }
}

第三步:實現(xiàn)具體處理器(ConcreteHandler)

這一步是重點,咱們把 “藍量檢查”“冷卻檢查”“被動檢查”“控制檢查” 這四個具體的檢查器寫出來,每個檢查器只干自己的活兒,不干別的。

1. 藍量檢查器(ManaHandler)

/**
 * 藍量檢查器(第一個攔路虎:沒藍放個屁技能)
 */
public class ManaHandler extends SkillHandler {
    @Override
    public String handle(SkillRequest request) {
        System.out.println("=== 藍量檢查器開始干活 ===");
        // 判斷當前藍量是否夠放技能
        if (request.getCurrentMana() < request.getManaCost()) {
            // 藍不夠,直接返回失敗,不往下傳了
            return request.getHeroName() + "藍量不足!當前" + request.getCurrentMana() + "藍,需要" + request.getManaCost() + "藍,回去補個藍buff吧!";
        }
        // 藍夠了,傳給下一個檢查器
        System.out.println(request.getHeroName() + "藍量充足,Pass!");
        return passToNext(request);
    }
}

2. 冷卻檢查器(CdHandler)

/**
 * 冷卻檢查器(第二個攔路虎:技能還在CD,急也沒用)
 */
public class CdHandler extends SkillHandler {
    @Override
    public String handle(SkillRequest request) {
        System.out.println("\n=== 冷卻檢查器開始干活 ===");
        // 冷卻時間為0表示冷卻好了
        if (request.getCurrentCd() > 0) {
            return request.getHeroName() + "的" + request.getSkillName() + "還在冷卻中!剩余" + request.getCurrentCd() + "秒,再等等!";
        }
        // 冷卻好了,傳給下一個檢查器
        System.out.println(request.getHeroName() + "的" + request.getSkillName() + "冷卻完成,Pass!");
        return passToNext(request);
    }
}

3. 被動檢查器(PassiveHandler)

李白的大招需要疊 4 層被動 “俠客行” 才能放,所以這個檢查器專門看被動夠不夠。

/**
 * 被動檢查器(第三個攔路虎:李白沒疊被動,大招就是個擺設)
 */
public class PassiveHandler extends SkillHandler {
    // 李白大招需要的被動層數(shù)(固定4層,寫死方便測試)
    private static final int REQUIRED_STACK = 4;
    @Override
    public String handle(SkillRequest request) {
        System.out.println("\n=== 被動檢查器開始干活 ===");
        // 只針對李白的大招做被動檢查(其他英雄不用)
        if ("李白".equals(request.getHeroName()) && "青蓮劍歌".equals(request.getSkillName())) {
            if (request.getPassiveStack() < REQUIRED_STACK) {
                return "李白被動“俠客行”層數(shù)不足!當前" + request.getPassiveStack() + "層,需要" + REQUIRED_STACK + "層,先A四下兵線吧!";
            }
            System.out.println("李白被動“俠客行”疊滿" + REQUIRED_STACK + "層,Pass!");
        } else {
            // 其他英雄/技能不用檢查被動,直接過
            System.out.println("當前英雄/技能無需檢查被動,Pass!");
        }
        // 傳給下一個檢查器
        return passToNext(request);
    }
}

4. 控制檢查器(ControlHandler)

被張良、東皇大招控住的時候,按啥技能都沒用,這個檢查器就是干這個的。

/**
 * 控制檢查器(第四個攔路虎:被控了還想放技能?想多了)
 */
public class ControlHandler extends SkillHandler {
    @Override
    public String handle(SkillRequest request) {
        System.out.println("\n=== 控制檢查器開始干活 ===");
        if (request.isControlled()) {
            return request.getHeroName() + "正在被控制!無法釋放" + request.getSkillName() + ",先等控制結束吧!";
        }
        // 沒被控,傳給下一個檢查器(如果有的話)
        System.out.println(request.getHeroName() + "未被控制,狀態(tài)良好,Pass!");
        return passToNext(request);
    }
}

第四步:客戶端測試(模擬李白放大招)

現(xiàn)在,咱們把這些檢查器串成一條 “責任鏈”,然后模擬幾種場景,看看效果。比如:藍不夠的場景、被動不夠的場景、全通過的場景。

/**
 * 客戶端(召喚師操作英雄釋放技能)
 */
public class HeroClient {
    public static void main(String[] args) {
        // 1. 創(chuàng)建各個檢查器(相當于找好“報銷”的各個負責人)
        SkillHandler manaHandler = new ManaHandler();       // 藍量檢查
        SkillHandler cdHandler = new CdHandler();           // 冷卻檢查
        SkillHandler passiveHandler = new PassiveHandler(); // 被動檢查
        SkillHandler controlHandler = new ControlHandler(); // 控制檢查
        // 2. 組裝責任鏈:藍量 → 冷卻 → 被動 → 控制(順序很重要?。?        manaHandler.setNextHandler(cdHandler);
        cdHandler.setNextHandler(passiveHandler);
        passiveHandler.setNextHandler(controlHandler);
        System.out.println("==================== 場景1:李白藍量不足 ====================");
        // 李白當前藍量50,大招需要100藍,冷卻0,被動4層,沒被控
        SkillRequest request1 = new SkillRequest("李白", "青蓮劍歌", 50, 100, 0, 4, false);
        String result1 = manaHandler.handle(request1);
        System.out.println("最終結果:" + result1);
        System.out.println("\n\n==================== 場景2:李白被動不足 ====================");
        // 李白藍量150(夠),冷卻0,被動2層(不夠),沒被控
        SkillRequest request2 = new SkillRequest("李白", "青蓮劍歌", 150, 100, 0, 2, false);
        String result2 = manaHandler.handle(request2);
        System.out.println("最終結果:" + result2);
        System.out.println("\n\n==================== 場景3:李白全條件滿足 ====================");
        // 李白藍量150,冷卻0,被動4層,沒被控
        SkillRequest request3 = new SkillRequest("李白", "青蓮劍歌", 150, 100, 0, 4, false);
        String result3 = manaHandler.handle(request3);
        System.out.println("最終結果:" + result3);
        System.out.println("\n\n==================== 場景4:李白被張良控住 ====================");
        // 李白啥都夠,但被張良控了
        SkillRequest request4 = new SkillRequest("李白", "青蓮劍歌", 150, 100, 0, 4, true);
        String result4 = manaHandler.handle(request4);
        System.out.println("最終結果:" + result4);
    }
}

看看運行結果,是不是符合預期?

咱們先猜一下:場景 1 藍不夠,肯定失敗;場景 2 被動不夠,失??;場景 3 全滿足,成功;場景 4 被控,失敗。實際運行結果如下:

==================== 場景1:李白藍量不足 ====================
=== 藍量檢查器開始干活 ===
李白藍量不足!當前50藍,需要100藍,回去補個藍buff吧!
最終結果:李白藍量不足!當前50藍,需要100藍,回去補個藍buff吧!


==================== 場景2:李白被動不足 ====================
=== 藍量檢查器開始干活 ===
李白藍量充足,Pass!

=== 冷卻檢查器開始干活 ===
李白的青蓮劍歌冷卻完成,Pass!

=== 被動檢查器開始干活 ===
李白被動“俠客行”層數(shù)不足!當前2層,需要4層,先A四下兵線吧!
最終結果:李白被動“俠客行”層數(shù)不足!當前2層,需要4層,先A四下兵線吧!


==================== 場景3:李白全條件滿足 ====================
=== 藍量檢查器開始干活 ===
李白藍量充足,Pass!

=== 冷卻檢查器開始干活 ===
李白的青蓮劍歌冷卻完成,Pass!

=== 被動檢查器開始干活 ===
李白被動“俠客行”疊滿4層,Pass!

=== 控制檢查器開始干活 ===
李白未被控制,狀態(tài)良好,Pass!
最終結果:李白的青蓮劍歌釋放成功!秀起來!


==================== 場景4:李白被張良控住 ====================
=== 藍量檢查器開始干活 ===
李白藍量充足,Pass!

=== 冷卻檢查器開始干活 ===
李白的青蓮劍歌冷卻完成,Pass!

=== 被動檢查器開始干活 ===
李白被動“俠客行”疊滿4層,Pass!

=== 控制檢查器開始干活 ===
李白正在被控制!無法釋放青蓮劍歌,先等控制結束吧!
最終結果:李白正在被控制!無法釋放青蓮劍歌,先等控制結束吧!

完美!跟咱們預期的一模一樣。這就是責任鏈模式的魅力 —— 每個環(huán)節(jié)只干自己的事,順序明確,邏輯清晰,哪怕以后要加新的檢查條件(比如 “李白是否處于草叢中”“是否有隊友提供增益”),只需要再加一個處理器,然后插到鏈條里就行,不用改原來的代碼。

三、深入聊:王者里還有哪些地方用了責任鏈?

李白放大招只是個小例子,實際上王者里到處都是責任鏈模式的影子,咱再挑幾個典型場景聊聊,幫你加深理解。

場景 1:傷害計算流程(比李白大招復雜 10 倍)

你以為 A 英雄打 B 英雄,傷害是 “一下算完” 的?太天真了!王者的傷害計算是一條超級長的責任鏈,咱們簡化一下都有這么多環(huán)節(jié):

  1. 基礎傷害處理器:先算英雄本身的攻擊力 / 法術強度(比如韓信滿級基礎物攻 180)。
  2. 裝備加成處理器:加上裝備提供的屬性(比如韓信出了無盡戰(zhàn)刃,加 130 物攻)。
  3. 銘文加成處理器:加上銘文提供的屬性(比如韓信帶了 10 個紅月,加 5 物攻)。
  4. buff 加成處理器:加上臨時 buff(比如紅 buff 加 20 物攻,隊友孫臏的二技能加攻擊力)。
  5. 護甲減免處理器:根據(jù) B 英雄的護甲,計算物理傷害減免(比如護甲 100,減免約 30% 傷害)。
  6. 魔抗減免處理器:如果是法術傷害,就按魔抗減免(比如魔女斗篷加 360 魔抗)。
  7. 護盾抵消處理器:如果 B 英雄有護盾(比如張飛的大招護盾、魔女斗篷的被動護盾),先扣護盾。
  8. 被動觸發(fā)處理器:比如呂布的被動 “真?zhèn)保ㄗo盾破了之后,普攻變成真實傷害,跳過護甲減免)、典韋的被動 “激怒”(疊滿 20 層加 240 物攻)。
  9. 傷害反彈處理器:比如反傷刺甲(受到物理傷害,反彈 15% 給攻擊者)、蘭陵王的被動(對生命值低于 50% 的目標加 20% 傷害)。

你看,這一條鏈走下來,才能算出 B 英雄最終掉多少血。如果用責任鏈模式實現(xiàn),每個處理器負責一個環(huán)節(jié),比如 “護甲減免處理器” 只算護甲減免,不管裝備加成,這樣哪怕王者以后改了護甲減免公式(比如從 “護甲 /(602 + 護甲)” 改成別的),只需要改這個處理器,其他環(huán)節(jié)完全不用動 —— 這就是解耦的好處。

場景 2:防御塔攻擊優(yōu)先級(誰先挨揍,責任鏈說了算)

玩王者的都知道,防御塔不是亂打的,它有固定的攻擊優(yōu)先級,這其實也是一條責任鏈:

  1. 攻擊己方英雄的敵人處理器:如果有敵人正在打我方英雄(比如對面韓信在 A 我方后羿),塔先打這個韓信。
  2. 最近的敵人處理器:如果沒人打我方英雄,塔打離自己最近的敵人(比如對面妲己離塔最近)。
  3. 攻擊防御塔的敵人處理器:如果有敵人正在 A 塔(比如對面魯班在點塔),塔優(yōu)先打這個魯班。
  4. 兵線優(yōu)先級處理器:如果沒有敵人,塔先打兵線,而且優(yōu)先打炮車(炮車血厚,拆塔快),再打步兵,最后打超級兵。

這個優(yōu)先級就是一條責任鏈,塔會按順序檢查:“有沒有人打我家英雄?”→“沒有?那誰離我最近?”→“也沒有?那誰在打我?”→“還沒有?那先清兵線吧”。如果以后王者改了優(yōu)先級(比如 “優(yōu)先打拆塔的敵人” 放到第一),只需要調整責任鏈的順序,不用改每個處理器的邏輯。

場景 3:技能效果觸發(fā)(比如大喬的二技能 “回家”)

大喬的二技能 “宿命之?!保乓粋€圈,隊友站進去 3 秒后會被傳送回泉水,這個過程也有責任鏈:

  1. 范圍檢查處理器:隊友是否在二技能的圈里?不在的話,無法觸發(fā)。
  2. 時間檢查處理器:是否站滿 3 秒?沒站滿就走了,無法觸發(fā)。
  3. 控制檢查處理器:隊友是否被控制(比如被眩暈、沉默)?被控的話,無法被傳送。
  4. 死亡檢查處理器:隊友是否已經(jīng)死了?死了的話,傳送個寂寞。
  5. 傳送執(zhí)行處理器:所有條件滿足,把隊友傳回家,同時回血回藍。

這也是責任鏈的典型應用 —— 每個條件都是一個處理器,逐個檢查,直到所有條件滿足,執(zhí)行最終效果。

四、聊點干貨:責任鏈模式的優(yōu)缺點(結合王者和 Java 開發(fā))

咱們聊了這么多王者里的例子,現(xiàn)在回歸 Java 開發(fā),聊聊責任鏈模式的優(yōu)缺點 —— 畢竟咱是技術博主,不能光聊游戲,得落地到實際開發(fā)。

優(yōu)點:用過的都說好

  1. 解耦!解耦!解耦?。ㄖ匾氖虑檎f三遍)
  • 處理器和請求者分離:請求者(比如李白)不用知道誰處理了請求(是藍量檢查器還是冷卻檢查器),只需要把請求傳給第一個處理器就行。
  • 處理器之間分離:藍量檢查器不用知道冷卻檢查器的邏輯,哪怕冷卻檢查器改了,藍量檢查器也不用動。
  • 就像王者里,你玩李白不用知道 “冷卻檢查” 是怎么實現(xiàn)的,你只需要按大招,游戲自己會走流程 —— 這就是解耦的魅力。
  1. 靈活!想加就加,想刪就刪
  • 想加新的處理器?比如王者以后給李白加個 “大招需要當前生命值大于 30%” 的條件,只需要加一個 “生命值檢查器”,插到責任鏈里(比如藍量檢查之后),其他代碼不用改。
  • 想刪處理器?比如王者取消了李白大招的被動限制,直接把 “被動檢查器” 從鏈里去掉就行。
  • 實際開發(fā)中,比如 Servlet 的 Filter 鏈(每個 Filter 就是一個處理器),你想加一個 “登錄驗證 Filter”,只需要在 web.xml 里配置一下,不用改其他 Filter 的代碼。
  1. 易于擴展!新英雄 / 新功能無縫接入
  • 王者出了個新英雄 “XX”,他的大招需要 “能量值”(不是藍量),那只需要加一個 “能量值檢查器”,其他處理器(冷卻、控制)照樣能用 —— 不用為了新英雄重寫整個責任鏈。
  • 實際開發(fā)中,比如 Spring 的 Interceptor 鏈(攔截器),你寫一個新的 “日志攔截器”,只需要實現(xiàn) HandlerInterceptor 接口,配置到 Spring 里,就能加入到攔截器鏈中,和其他攔截器一起工作。

缺點:別瞎用,小心踩坑

  1. 責任鏈太長,效率會低
  • 比如王者的傷害計算鏈,如果有 10 個處理器,每個處理器都要做計算,雖然對游戲來說毫秒級能搞定,但如果是高并發(fā)場景(比如秒殺系統(tǒng)),太長的責任鏈會增加響應時間。
  • 實際開發(fā)中,要控制責任鏈的長度,別什么都往鏈里塞。
  1. 可能出現(xiàn) “無人處理” 的情況
  • 比如李白放技能,所有處理器都沒攔著,但最后發(fā)現(xiàn) “技能按鈕壞了”(當然王者不會有這情況),結果請求走到鏈尾,沒人處理 —— 這時候要加個 “默認處理器”,返回明確的失敗信息。
  • 實際開發(fā)中,比如你寫了個 Filter 鏈,但所有 Filter 都沒處理請求,也沒傳給下一個,最后請求就卡住了 —— 所以要確保鏈的每個節(jié)點要么處理,要么傳給下一個,或者有默認處理。
  1. 調試有點麻煩
  • 責任鏈是 “鏈式調用”,如果某個環(huán)節(jié)出了問題(比如李白大招放不出來,不知道是藍不夠還是被動不夠),你得順著鏈一個個查。
  • 實際開發(fā)中,建議在每個處理器里加日志(比如咱們剛才代碼里的 System.out),方便調試時定位問題。

五、接地氣:責任鏈模式在 Java 開發(fā)中的實際應用

聊完王者,咱再聊聊工作中能用到的場景,讓你學完就能用。

1. Servlet 的 Filter 鏈(最經(jīng)典的應用)

你寫 Java Web 項目時,肯定用過 Filter(過濾器),比如登錄驗證 Filter、字符編碼 Filter、日志 Filter—— 這些 Filter 就是一條責任鏈。

  • 流程:請求(Request)先經(jīng)過登錄驗證 Filter(檢查是否登錄,沒登錄跳登錄頁)→ 再經(jīng)過字符編碼 Filter(設置 UTF-8 編碼)→ 再經(jīng)過日志 Filter(記錄請求 URL 和時間)→ 最后到達 Servlet。
  • 對應關系:Filter 接口就是抽象處理器(Handler),doFilter () 方法就是 handle () 方法,chain.doFilter () 就是 passToNext () 方法,每個具體的 Filter(登錄 Filter、編碼 Filter)就是具體處理器。

這和王者里李白放大招的責任鏈幾乎一模一樣!

2. Spring 的 Interceptor 鏈(攔截器)

Spring MVC 里的 Interceptor(攔截器),比如權限攔截器、性能監(jiān)控攔截器,也是責任鏈模式。

  • 流程:請求先經(jīng)過 preHandle () 方法(比如檢查權限)→ 再到 Controller 處理業(yè)務→ 最后經(jīng)過 postHandle () 和 afterCompletion () 方法(比如記錄接口耗時)。
  • 特點:Interceptor 鏈可以動態(tài)配置,比如某些接口不需要登錄驗證,就可以排除對應的 Interceptor—— 就像王者里某些技能不需要檢查被動,直接跳過被動處理器。

3. MyBatis 的 Plugin 鏈(插件)

MyBatis 的插件(比如分頁插件、日志插件),也是基于責任鏈模式實現(xiàn)的。

  • 流程:執(zhí)行 SQL 時,先經(jīng)過分頁插件(動態(tài)拼接 limit 語句)→ 再經(jīng)過日志插件(記錄 SQL 語句和執(zhí)行時間)→ 最后執(zhí)行 SQL。
  • 原理:每個 Plugin 都實現(xiàn) InvocationHandler 接口,通過動態(tài)代理把多個 Plugin 串成一條鏈,SQL 執(zhí)行請求沿著鏈傳遞,每個 Plugin 處理后傳給下一個。

六、總結:玩王者學設計模式,不香嗎?

看到這里,你應該明白:王者里那些看似 “理所當然” 的邏輯,背后藏著很多硬核的 Java 設計模式。責任鏈模式不是什么高大上的東西,它就是 “排隊辦事”,把復雜的流程拆成一個個小環(huán)節(jié),每個環(huán)節(jié)只干自己的事,讓代碼更清晰、更靈活、更好維護。

最后再回顧一下重點:

  1. 責任鏈模式的核心:請求沿著處理器鏈條傳遞,直到被處理或鏈結束。
  2. 王者中的應用:李白放大招、傷害計算、防御塔優(yōu)先級。
  3. 實際開發(fā)中的應用:Servlet Filter、Spring Interceptor、MyBatis Plugin。
  4. 優(yōu)點:解耦、靈活、易擴展;缺點:長鏈效率低、調試麻煩。

下次你玩王者的時候,不妨多想想:“這個邏輯用了什么設計模式?” 既能玩游戲,又能學技術,豈不美哉?

責任編輯:武曉燕 來源: 石杉的架構筆記
相關推薦

2023-09-28 08:45:56

開源責任鏈模式

2021-12-24 07:50:45

責任鏈模式設計

2024-05-09 12:17:00

責任鏈設計模式

2022-12-28 08:08:57

2012-03-28 13:28:56

Java設計模式

2024-12-03 15:52:45

責任鏈Java

2024-06-20 13:11:26

設計模式開發(fā)

2022-11-01 08:46:20

責任鏈模式對象

2025-01-03 10:32:26

Spring責任鏈模式

2010-04-01 09:10:03

PHP設計模式責任鏈模式

2021-08-06 06:49:19

王者榮耀項目IDEA

2017-08-30 12:17:02

Python王者榮耀套路

2021-07-14 10:08:30

責任鏈模式加工鏈

2024-01-30 13:15:00

設計模式責任鏈

2023-09-26 00:27:07

設計模式鏈接

2017-10-30 08:20:16

王者榮耀騰訊云游戲

2017-11-27 11:02:46

高并發(fā)突發(fā)池系統(tǒng)架構王者榮耀

2022-06-30 20:47:58

區(qū)塊鏈

2022-06-27 08:01:55

動畫CSS前端

2021-11-22 23:50:59

責任鏈模式場景
點贊
收藏

51CTO技術棧公眾號