亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java策略模式實例分析

發布時間:2022-02-28 09:08:17 來源:億速云 閱讀:166 作者:iii 欄目:開發技術

這篇文章主要講解了“Java策略模式實例分析”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java策略模式實例分析”吧!

    優點

    1.算法可以自由切換。

    2.避免使用多重條件判斷。

    3.擴展性良好。

    缺點

    1.策略類會增多。

    2.所有策略類都需要對外暴露。

    使用場景

    1.如果在一個系統里面有許多類,它們之間的區別僅在于它們的行為,那么使用策略模式可以動態地讓一個對象在許多行為中選擇一種行為。

    2.一個系統需要動態地在幾種算法中選擇一種。

    3.如果一個對象有很多的行為,如果不用恰當的模式,這些行為就只好使用多重的條件選擇語句來實現。

    一、實現方式

    假設一個場景,我們在電商系統中,訂單分為很多種,例如:普通訂單,秒殺訂單,拼團訂單等等。我們需要創建一個訂單的時候,由于訂單的類型不同,我們需要根據訂單的類型執行不同的業務邏輯。

    1、訂單類型枚舉類

    package com.asurplus.common.strategy;
    import lombok.AllArgsConstructor;
    import lombok.Getter;
    /**
     * 訂單類型枚舉類
     */
    @Getter
    @AllArgsConstructor
    public enum OrderTypeEnum {
        COMMON(1001, "普通訂單"),
        SECKILL(1002, "秒殺訂單"),
        SPELL(1003, "拼團訂單");
        int type;
        String desc;
    }

    我們的訂單分為三種,普通訂單,秒殺訂單,拼團訂單。

    2、訂單處理接口

    package com.asurplus.common.strategy;
    /**
     * 訂單處理接口
     */
    public interface OrderService {
        /**
         * 創建訂單
         *
         * @return
         */
        void createOrder();
        /**
         * 獲取訂單類型
         *
         * @return
         */
        OrderTypeEnum type();
    }

    3、普通訂單處理器

    package com.asurplus.common.strategy;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.stereotype.Service;
    /**
     * 普通訂單處理器
     */
    @Slf4j
    @Service
    public class CommonOrderServiceImpl implements OrderService {
        @Override
        public void createOrder() {
            log.info("創建 普通訂單");
        }
        @Override
        public OrderTypeEnum type() {
            return OrderTypeEnum.COMMON;
        }
    }

    4、秒殺訂單處理器

    package com.asurplus.common.strategy;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.stereotype.Service;
    /**
     * 秒殺訂單處理器
     */
    @Slf4j
    @Service
    public class SeckillOrderServiceImpl implements OrderService {
        @Override
        public void createOrder() {
            log.info("創建 秒殺訂單");
        }
        @Override
        public OrderTypeEnum type() {
            return OrderTypeEnum.SECKILL;
        }
    }

    5、拼團訂單處理器

    package com.asurplus.common.strategy;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.stereotype.Service;
    /**
     * 拼團訂單處理器
     */
    @Slf4j
    @Service
    public class SpellOrderServiceImpl implements OrderService {
        @Override
        public void createOrder() {
            log.info("創建 拼團訂單");
        }
        @Override
        public OrderTypeEnum type() {
            return OrderTypeEnum.SPELL;
        }
    }

    6、下單管理器

    package com.asurplus.common.strategy;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    import java.util.List;
    import java.util.Optional;
    /**
     * 訂單管理器
     */
    @Component
    public class OrderManager {
        /**
         * Autowired 注解的強大之處
         */
        @Autowired
        private List<OrderService> orderServices;
        /**
         * 創建訂單
         *
         * @param type 訂單類型
         * @return
         */
        public void createOrder(int type) {
            /**
             * 根據訂單類型,找到對應的處理器
             */
            Optional<OrderService> any = orderServices.stream().filter(f -> f.type().getType() == type).findAny();
            /**
             * 沒有對應的處理器
             */
            if (!any.isPresent()) {
                throw new RuntimeException("沒有找到相應的訂單實現");
            }
            // 創建訂單
            any.get().createOrder();
        }
    }

    這里就能體現出 @Autowired 的強大之處,可以一次性自動注入多個對象。根據訂單類型,選出對應的處理器來處理該訂單。

    二、測試

    1、引入依賴

    <!-- 測試依賴 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>

    2、測試用例

    package com.asurplus.common.strategy;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    /**
     * 策略模式
     */
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class TestMain {
        @Autowired
        private OrderManager orderManager;
        @Test
        public void test() {
            // 創建 秒殺訂單
            orderManager.createOrder(OrderTypeEnum.SECKILL.getType());
        }
    }

    輸出結果

    Java策略模式實例分析

    感謝各位的閱讀,以上就是“Java策略模式實例分析”的內容了,經過本文的學習后,相信大家對Java策略模式實例分析這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    龙泉市| 宁夏| 集贤县| 库伦旗| 抚州市| 衡山县| 汝阳县| 平泉县| 吉木萨尔县| 华池县| 油尖旺区| 衡山县| 景泰县| 墨玉县| 蕉岭县| 永清县| 历史| 亚东县| 石狮市| 龙南县| 通江县| 西乌珠穆沁旗| 彰化县| 托克逊县| 天峻县| 新平| 长岛县| 增城市| 益阳市| 隆昌县| 安塞县| 米泉市| 璧山县| 天等县| 民县| 承德市| 手游| 忻州市| 敦煌市| 原阳县| 滦平县|