欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中常用的設計模式之責任鏈模式詳解

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

優(yōu)點

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

2.簡化了對象。使得對象不需要知道鏈的結構。

3.增強給對象指派職責的靈活性。通過改變鏈內的成員或者調動它們的次序,允許動態(tài)地新增或者刪除責任。

4、增加新的請求處理類很方便。

缺點

1.不能保證請求一定被接收。

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

3.可能不容易觀察運行時的特征,有礙于除錯。

使用場景

1.有多個對象可以處理同一個請求,具體哪個對象處理該請求由運行時刻自動確定。

2.在不明確指定接收者的情況下,向多個對象中的一個提交一個請求。

3.可動態(tài)指定一組對象處理請求。

一、實現方式

假設一個場景,學校里,校長的職能大于老師,老師的職能大于學生,基于這樣的鏈路關系,學生處理不了的事情上報給老師,老師處理不了的事情上報給校長。

1、處理抽象類

package com.asurplus.common.handle.style1;
/**
 * 處理抽象類
 */
public abstract class Handler {
    /**
     * 下一個處理類
     */
    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、學生處理類

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

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

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);
        }
    }
}

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

4、校長處理類

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

校長能處理“學籍問題”這件事,如果是其他事件,由于我們的責任鏈只有三級,都處理不了,只能打印日志了

5、測試

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

輸出結果

在這里插入圖片描述

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

二、實現方式

假設一個場景,在我們的電商系統(tǒng)中,當創(chuàng)建一個訂單的時候,我們需要去校驗很多的數據,我們需要去判斷該商品存不存在,庫存還有沒有,價格對不對,等等校驗。

1、訂單信息類

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

2、訂單校驗接口

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

3、庫存校驗器

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

4、價格校驗器

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

5、測試

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

在這里插入圖片描述

被我們的“庫存校驗器”校驗不通過,導致下單失敗。

總結

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

相關文章

  • Java線程池大小的設置方法實例

    Java線程池大小的設置方法實例

    線程池的設置是有方法的,不是憑借簡單的估算來決定的,這篇文章主要給大家介紹了關于Java線程池大小的設置方法,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-08-08
  • Spring Security使用單點登錄的權限功能

    Spring Security使用單點登錄的權限功能

    本文主要介紹了Spring Security使用單點登錄的權限功能,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-04-04
  • java中的動態(tài)代理與責任鏈模式詳解

    java中的動態(tài)代理與責任鏈模式詳解

    這篇文章主要介紹了java中的動態(tài)代理與責任鏈模式詳解,動態(tài)代理提供了一種靈活且非侵入式的方式,可以對對象的行為進行定制和擴展,它在代碼重用、解耦和業(yè)務邏輯分離、性能優(yōu)化以及系統(tǒng)架構中起到了重要的作用,需要的朋友可以參考下
    2023-08-08
  • Spring Boot環(huán)境屬性占位符解析及類型轉換詳解

    Spring Boot環(huán)境屬性占位符解析及類型轉換詳解

    這篇文章主要給大家介紹了關于Spring Boot環(huán)境屬性占位符解析及類型轉換的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-08-08
  • java基于正則表達式實現時間日期的常用判斷操作實例

    java基于正則表達式實現時間日期的常用判斷操作實例

    這篇文章主要介紹了java基于正則表達式實現時間日期的常用判斷操作,簡單說明了正則表達式常用元字符含義并結合實例形式分析了java基于正則表達式針對常用日期時間格式的判斷操作技巧,需要的朋友可以參考下
    2017-10-10
  • 改善Java代碼之慎用java動態(tài)編譯

    改善Java代碼之慎用java動態(tài)編譯

    這篇文章主要介紹了改善Java代碼之慎用java動態(tài)編譯,需要的朋友可以參考下
    2021-04-04
  • Spring?容器初始化?register?與?refresh方法

    Spring?容器初始化?register?與?refresh方法

    這篇文章主要介紹了Spring?容器初始化?register?與?refresh方法,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-07-07
  • java環(huán)境變量配置超詳細圖文教程

    java環(huán)境變量配置超詳細圖文教程

    在我們學習Java語言的時候,要在命令提示符里運用Java和Javac,用到這兩個命令的時候就要配置Java環(huán)節(jié)變量才可以,這篇文章主要給大家介紹了關于java環(huán)境變量配置的相關資料,需要的朋友可以參考下
    2023-10-10
  • JAVA設計模式之訪問者模式詳解

    JAVA設計模式之訪問者模式詳解

    這篇文章主要介紹了JAVA設計模式之訪問者模式詳解,訪問者模式是對象的行為模式,訪問者模式的目的是封裝一些施加于某種數據結構元素之上的操作,需要的朋友可以參考下
    2015-04-04
  • Spring Boot使用profile如何配置不同環(huán)境的配置文件

    Spring Boot使用profile如何配置不同環(huán)境的配置文件

    ,springboot支持通過不同的profile來配置不同環(huán)境的配置,下面就大致介紹一下yml配置文件跟properties配置文件怎么使用profile配置不同環(huán)境的配置文件
    2018-01-01

最新評論