最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中常用的設(shè)計(jì)模式之責(zé)任鏈模式詳解

 更新時(shí)間:2022年02月27日 11:56:38   作者:Asurplus、  
這篇文章主要為大家詳細(xì)介紹了Java中常用的設(shè)計(jì)模式之責(zé)任鏈模式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

優(yōu)點(diǎn)

1.降低耦合度。它將請(qǐng)求的發(fā)送者和接收者解耦。

2.簡(jiǎn)化了對(duì)象。使得對(duì)象不需要知道鏈的結(jié)構(gòu)。

3.增強(qiáng)給對(duì)象指派職責(zé)的靈活性。通過改變鏈內(nèi)的成員或者調(diào)動(dòng)它們的次序,允許動(dòng)態(tài)地新增或者刪除責(zé)任。

4、增加新的請(qǐng)求處理類很方便。

缺點(diǎn)

1.不能保證請(qǐng)求一定被接收。

2.系統(tǒng)性能將受到一定影響,而且在進(jìn)行代碼調(diào)試時(shí)不太方便,可能會(huì)造成循環(huán)調(diào)用。

3.可能不容易觀察運(yùn)行時(shí)的特征,有礙于除錯(cuò)。

使用場(chǎng)景

1.有多個(gè)對(duì)象可以處理同一個(gè)請(qǐng)求,具體哪個(gè)對(duì)象處理該請(qǐng)求由運(yùn)行時(shí)刻自動(dòng)確定。

2.在不明確指定接收者的情況下,向多個(gè)對(duì)象中的一個(gè)提交一個(gè)請(qǐng)求。

3.可動(dòng)態(tài)指定一組對(duì)象處理請(qǐng)求。

一、實(shí)現(xiàn)方式

假設(shè)一個(gè)場(chǎng)景,學(xué)校里,校長(zhǎng)的職能大于老師,老師的職能大于學(xué)生,基于這樣的鏈路關(guān)系,學(xué)生處理不了的事情上報(bào)給老師,老師處理不了的事情上報(bào)給校長(zhǎng)。

1、處理抽象類

package com.asurplus.common.handle.style1;
/**
 * 處理抽象類
 */
public abstract class Handler {
    /**
     * 下一個(gè)處理類
     */
    protected Handler handler;
    public void setHandler(Handler handler) {
        this.handler = handler;
    }
    public Handler getHandler() {
        return handler;
    }

    /**
     * 處理事件
     *
     * @param request
     */
    public abstract void handlerRequest(String request);
}

2、學(xué)生處理類

package com.asurplus.common.handle.style1;
import lombok.extern.slf4j.Slf4j;
/**
 * 學(xué)生處理類
 */
@Slf4j
public class StudentHandler extends Handler {
    @Override
    public void handlerRequest(String request) {
        if ("打掃衛(wèi)生".equals(request)) {
            log.info("學(xué)生處理中");
        } else {
            this.handler.handlerRequest(request);
        }
    }
}

學(xué)生能處理“打掃衛(wèi)生”這件事,如果是其他事件,交給他的下一個(gè)元素

3、老師處理類

package com.asurplus.common.handle.style1;
import lombok.extern.slf4j.Slf4j;
/**
 * 老師處理類
 */
@Slf4j
public class TeacherHandler extends Handler {
    @Override
    public void handlerRequest(String request) {
        if ("批改試卷".equals(request)) {
            log.info("老師處理中");
        } else {
            this.handler.handlerRequest(request);
        }
    }
}

老師能處理“批改試卷”這件事,如果是其他事件,交給他的下一個(gè)元素

4、校長(zhǎng)處理類

package com.asurplus.common.handle.style1;
import lombok.extern.slf4j.Slf4j;
/**
 * 校長(zhǎng)處理類
 */
@Slf4j
public class HeadHandler extends Handler {
    @Override
    public void handlerRequest(String request) {
        if ("學(xué)籍問題".equals(request)) {
            log.info("校長(zhǎng)處理中");
        } else {
            log.error("無法處理該事件");
        }
    }
}

校長(zhǎng)能處理“學(xué)籍問題”這件事,如果是其他事件,由于我們的責(zé)任鏈只有三級(jí),都處理不了,只能打印日志了

5、測(cè)試

package com.asurplus.common.handle.style1;
/**
 * 責(zé)任鏈模式
 */
public class TestMain {
    public static void main(String[] args) {
        // 學(xué)生處理器
        StudentHandler studentHandler = new StudentHandler();
        // 老師處理器
        TeacherHandler teacherHandler = new TeacherHandler();
        // 校長(zhǎng)處理器
        HeadHandler headHandler = new HeadHandler();
        // 老師的上一級(jí)是校長(zhǎng)
        teacherHandler.setHandler(headHandler);
        // 學(xué)生的上一級(jí)是老師
        studentHandler.setHandler(teacherHandler);
        // 處理 批改試卷 這件事
        studentHandler.handlerRequest("批改試卷");
    }
}

輸出結(jié)果

在這里插入圖片描述

可以看出,“批改試卷”這件事,被老師處理了。

二、實(shí)現(xiàn)方式

假設(shè)一個(gè)場(chǎng)景,在我們的電商系統(tǒng)中,當(dāng)創(chuàng)建一個(gè)訂單的時(shí)候,我們需要去校驗(yàn)很多的數(shù)據(jù),我們需要去判斷該商品存不存在,庫存還有沒有,價(jià)格對(duì)不對(duì),等等校驗(yàn)。

1、訂單信息類

package com.asurplus.common.handle.style2;
import lombok.Builder;
import lombok.Data;
/**
 * 訂單信息
 */
@Data
@Builder
public class Order {
    // 庫存
    private int stock;
    // 單價(jià)
    private int price;
}

2、訂單校驗(yàn)接口

package com.asurplus.common.handle.style2;
/**
 * 校驗(yàn)器接口
 *
 * @param <T>
 */
public interface OrderFilter<T> {
    /**
     * 業(yè)務(wù)邏輯
     *
     * @param t
     * @return
     */
    boolean execute(T t);
}

3、庫存校驗(yàn)器

package com.asurplus.common.handle.style2;
import lombok.extern.slf4j.Slf4j;
/**
 * 庫存校驗(yàn)器
 */
@Slf4j
public class OrderStockFilter implements OrderFilter<Order> {
    @Override
    public boolean execute(Order order) {
        if (0 >= order.getStock()) {
            log.error("庫存不足");
            return false;
        }
        return true;
    }
}

4、價(jià)格校驗(yàn)器

package com.asurplus.common.handle.style2;
import lombok.extern.slf4j.Slf4j;
/**
 * 價(jià)格校驗(yàn)器
 */
@Slf4j
public class OrderPriceFilter implements OrderFilter<Order> {
    @Override
    public boolean execute(Order order) {
        if (0 > order.getPrice()) {
            log.error("價(jià)格錯(cuò)誤");
            return false;
        }
        return true;
    }
}

5、測(cè)試

package com.asurplus.common.handle.style2;
import lombok.extern.slf4j.Slf4j;
import java.util.Arrays;
import java.util.List;
/**
 * 責(zé)任鏈模式
 */
@Slf4j
public class TestMain {
    public static void main(String[] args) {
        // 建造者模式創(chuàng)建一個(gè)訂單
        Order order = Order.builder().stock(0).price(0).build();
        // 庫存校驗(yàn)器
        OrderStockFilter orderQuantityFilter = new OrderStockFilter();
        // 價(jià)格校驗(yàn)器
        OrderPriceFilter orderPriceFilter = new OrderPriceFilter();
        // 組裝成一個(gè)list
        List<OrderFilter<Order>> orderFilters = Arrays.asList(orderQuantityFilter, orderPriceFilter);
        boolean res = false;
        // 循環(huán)校驗(yàn)
        for (OrderFilter<Order> item : orderFilters) {
            res = item.execute(order);
            // 其中任何一項(xiàng)不通過就停止校驗(yàn)
            if (!res) {
                break;
            }
        }
        if (!res) {
            log.error("下單失敗");
        }
    }
}

在這里插入圖片描述

被我們的“庫存校驗(yàn)器”校驗(yàn)不通過,導(dǎo)致下單失敗。

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!    

相關(guān)文章

  • SpringBoot整合定時(shí)任務(wù)的方法

    SpringBoot整合定時(shí)任務(wù)的方法

    通過 ThreadPoolExecutor 可以實(shí)現(xiàn)各式各樣的自定義線程池,而 ScheduledThreadPoolExecutor 類則在自定義線程池的基礎(chǔ)上增加了周期性執(zhí)行任務(wù)的功能,這篇文章主要介紹了SpringBoot整合定時(shí)任務(wù),需要的朋友可以參考下
    2024-05-05
  • Java關(guān)鍵字詳解之final static this super的用法

    Java關(guān)鍵字詳解之final static this super的用法

    this用來調(diào)用目前類自身的成員變量,super多用來調(diào)用父類的成員,final多用來定義常量用的,static定義靜態(tài)變量方法用的,靜態(tài)變量方法只能被類本身調(diào)用,下文將詳細(xì)介紹,需要的朋友可以參考下
    2021-10-10
  • 關(guān)于SpringBoot的自動(dòng)裝配原理詳解

    關(guān)于SpringBoot的自動(dòng)裝配原理詳解

    這篇文章主要介紹了關(guān)于SpringBoot的自動(dòng)裝配原理詳解,Spring?Boot自動(dòng)裝配原理是指Spring?Boot在啟動(dòng)時(shí)自動(dòng)掃描項(xiàng)目中的依賴關(guān)系,根據(jù)依賴關(guān)系自動(dòng)配置相應(yīng)的Bean,從而簡(jiǎn)化了Spring應(yīng)用的配置過程,需要的朋友可以參考下
    2023-07-07
  • Java UrlRewriter偽靜態(tài)技術(shù)運(yùn)用深入分析

    Java UrlRewriter偽靜態(tài)技術(shù)運(yùn)用深入分析

    通常我們?yōu)榱烁玫木徑夥?wù)器壓力,和增強(qiáng)搜索引擎的友好面,都將文章內(nèi)容生成靜態(tài)頁面,這就產(chǎn)生了偽靜態(tài)技術(shù),也就是我們常說的Url Rewriter重寫技術(shù)
    2012-12-12
  • java反射獲取方法參數(shù)名的幾種方式總結(jié)

    java反射獲取方法參數(shù)名的幾種方式總結(jié)

    這篇文章主要介紹了如何通過添加編譯參數(shù)或使用Spring的工具類來獲取方法參數(shù)名,還總結(jié)了不同版本的JDK和Spring項(xiàng)目中參數(shù)名獲取的優(yōu)缺點(diǎn),并提供了應(yīng)用場(chǎng)景舉例,需要的朋友可以參考下
    2025-02-02
  • Java無法獲取真實(shí)IP解決方案

    Java無法獲取真實(shí)IP解決方案

    這篇文章主要介紹了Java無法獲取真實(shí)IP解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12
  • SpringBoot接收參數(shù)使用的注解實(shí)例講解

    SpringBoot接收參數(shù)使用的注解實(shí)例講解

    這篇文章主要介紹了詳解SpringBoot接收參數(shù)使用的幾種常用注解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • springboot整合minio的超詳細(xì)教程

    springboot整合minio的超詳細(xì)教程

    在很多互聯(lián)網(wǎng)產(chǎn)品應(yīng)用中,都涉及到各種與文件存儲(chǔ)相關(guān)的業(yè)務(wù),隨著技術(shù)的發(fā)展,關(guān)于如何解決分布式文件存儲(chǔ)也有了比較成熟的方案,比如私有云部署下可以考慮fastdfs,阿里云對(duì)象存儲(chǔ)oss,七牛云等,本篇將為你介紹另一種文件存儲(chǔ)方式,即MinIO,需要的朋友可以參考下
    2023-12-12
  • 詳解Spring數(shù)據(jù)緩存注解@Cacheable、@CachePut、@CacheEvict

    詳解Spring數(shù)據(jù)緩存注解@Cacheable、@CachePut、@CacheEvict

    這篇文章主要介紹了詳解Spring數(shù)據(jù)緩存注解@Cacheable、CachePut、@CacheEvict,當(dāng)以一組參數(shù)第一次調(diào)用某個(gè)方法時(shí),返回值會(huì)被保存在緩存中,如果這個(gè)方法再次以相同的參數(shù)進(jìn)行調(diào)用時(shí),這個(gè)返回值會(huì)從緩存中查詢獲取,需要的朋友可以參考下
    2023-07-07
  • Spring?session?redis?修改默認(rèn)的序列化方法(案例)

    Spring?session?redis?修改默認(rèn)的序列化方法(案例)

    這篇文章主要介紹了Spring?session?redis?修改默認(rèn)的序列化方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04

最新評(píng)論

大姚县| 白沙| 北川| 平昌县| 乌鲁木齐县| 石楼县| 宁强县| 枣阳市| 浑源县| 甘孜| 樟树市| 永泰县| 井陉县| 芜湖市| 兴化市| 云阳县| 星子县| 石阡县| 西吉县| 海门市| 行唐县| 达拉特旗| 胶州市| 平乐县| 徐闻县| 淮阳县| 寻乌县| 南召县| 仙居县| 星座| 丰顺县| 靖江市| 渭源县| 西充县| 东辽县| 腾冲县| 武城县| 九龙城区| 来宾市| 塔城市| 太仆寺旗|