国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java設計模式-策略模式-基于Spring實現(xiàn)

這篇具有很好參考價值的文章主要介紹了Java設計模式-策略模式-基于Spring實現(xiàn)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1、策略模式

1.1、概述

策略模式是一種行為設計模式,它允許在運行時選擇算法的行為。它將算法封裝在獨立的策略類中,使得它們可以相互替換,而不影響客戶端代碼。這種模式通過將算法的選擇從客戶端代碼中分離出來,提供了更大的靈活性和可維護性。

在Java中,策略模式的設計理念可以通過以下步驟實現(xiàn):

  1. 定義一個策略接口(或抽象類),該接口定義了所有具體策略類都必須實現(xiàn)的方法。
  2. 創(chuàng)建具體的策略類,實現(xiàn)策略接口,并提供具體的算法實現(xiàn)。
  3. 在客戶端代碼中,創(chuàng)建一個策略對象,并將其傳遞給需要使用算法的對象。
  4. 客戶端對象使用策略對象來執(zhí)行特定的算法。

在你提供的代碼片段中,我無法確定與策略模式相關(guān)的代碼。如果你有更多的上下文或示例代碼,我可以更好地幫助你理解和應用策略模式。

1.2、優(yōu)缺點

策略模式具有以下優(yōu)點:

  • 可以代替if-else
  1. 算法的獨立性:策略模式將算法封裝在獨立的策略類中,使得算法可以獨立于客戶端代碼進行修改和擴展。這樣可以提高代碼的靈活性和可維護性。

  2. 可替換性:由于策略模式將算法封裝在不同的策略類中,因此可以在運行時動態(tài)地切換和替換算法。這樣可以根據(jù)不同的需求選擇最合適的算法,而無需修改客戶端代碼。

  3. 單一職責原則:策略模式將不同的算法封裝在不同的策略類中,使得每個策略類只負責一個具體的算法。這樣符合單一職責原則,提高了代碼的可讀性和可維護性。

  4. 擴展性:由于策略模式將算法封裝在獨立的策略類中,因此可以很容易地添加新的策略類來擴展系統(tǒng)的功能。

策略模式也有一些缺點:

  1. 增加了類的數(shù)量:使用策略模式會增加系統(tǒng)中的類的數(shù)量,因為每個具體的算法都需要一個對應的策略類。這可能會增加代碼的復雜性和理解難度。

  2. 客戶端必須了解所有的策略類:客戶端必須了解所有可用的策略類,并在運行時選擇合適的策略。這可能會增加客戶端代碼的復雜性。

  3. 策略切換的開銷:在運行時切換策略可能會帶來一定的開銷,特別是在需要頻繁切換策略的情況下。這可能會影響系統(tǒng)的性能。

綜上所述,策略模式在提供靈活性、可維護性和可擴展性方面具有很多優(yōu)點,但也需要權(quán)衡其增加的類數(shù)量和策略切換的開銷。在設計和使用策略模式時,需要根據(jù)具體的需求和情況進行權(quán)衡和選擇。

2、SpringBean方式實現(xiàn)

  • bean的名字(默認):實現(xiàn)策略類的名字首字母小寫

2.1、實現(xiàn)步奏

  • 可以看到,去獲取bean是需要用戶自己去做的。

Java設計模式-策略模式-基于Spring實現(xiàn)

2.2、實現(xiàn)

①定義策略接口

package com.cc.eed.strategy;

/**
 * <p>基于SpringBean的策略模式</p>
 *
 * @author CC
 * @since 2023/10/13
 */
public interface ISpringBeanStrategy {

    /**
     * 吃飯
     */
    String eating();

    /**
     * 玩
     */
    String play();
}

②定義實現(xiàn)類1

package com.cc.eed.strategy.impl;

import com.cc.eed.strategy.ISpringBeanStrategy;
import org.springframework.stereotype.Component;

/**
 * <p>小美</p>
 *
 * @author CC
 * @since 2023/10/13
 */
@Component
public class MeiSpringBeanImpl implements ISpringBeanStrategy {

    /**
     * 吃飯
     */
    @Override
    public String eating() {
        return "小美,吃飯!";
    }

    /**
     * 玩
     */
    @Override
    public String play() {
        return "小美,玩!";
    }
}

定義實現(xiàn)類2

package com.cc.eed.strategy.impl;

import com.cc.eed.strategy.ISpringBeanStrategy;
import org.springframework.stereotype.Component;

/**
 * <p>小明</p>
 *
 * @author CC
 * @since 2023/10/13
 */
@Component
public class MingSpringBeanImpl implements ISpringBeanStrategy {

    /**
     * 吃飯
     */
    @Override
    public String eating() {
        return "小明,吃飯!";
    }

    /**
     * 玩
     */
    @Override
    public String play() {
        return "小明,玩!";
    }
}

③定義beanName的枚舉

  • 用于使用類型int獲取對應的beanName
package com.cc.eed.enums;

import lombok.Getter;
import org.springframework.util.Assert;

import java.util.Arrays;

/**
 * <p></p>
 *
 * @author CC
 * @since 2023/10/13
 */
@Getter
public enum PeopleEnum {

    MING(1, "小明", "mingSpringBeanImpl"),
    MEI(2, "小美", "meiSpringBeanImpl")
    ;

    public Integer type;

    public String name;

    public String beanName;

    /** <p>根據(jù)類型獲取beanName<p>
     * @param type type
     * @return {@link String}
     * @since 2023/10/13
     * @author CC
     **/
    public static String getBeanName(Integer type) {
        PeopleEnum peopleEnum = Arrays.stream(values())
                .filter(p -> p.getType().equals(type))
                .findAny().orElse(null);
        Assert.notNull(peopleEnum, "暫不支持的策略模式!");
        return peopleEnum.getBeanName();
    }


    PeopleEnum(Integer type, String name, String beanName) {
        this.type = type;
        this.name = name;
        this.beanName = beanName;
    }

    public void setType(Integer type) {
        this.type = type;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setBeanName(String beanName) {
        this.beanName = beanName;
    }
}

④使用springBean工具類獲取beanName

  • 略,見:https://www.cnblogs.com/kakarotto-chen/p/17760069.html

⑤使用

  • 傳入不同的類型,獲取不同的策略
@Test
public void test02()throws Exception{
    //根據(jù)BeanName獲取具體的bean,實現(xiàn)策略模式
    //根據(jù)人員ID(或者類型)獲取不同的bean
    String beanName = PeopleEnum.getBeanName(1);
    ISpringBeanStrategy bean = (ISpringBeanStrategy) SpringBeanUtil.getBean(beanName);

    String eating = bean.eating();
    System.out.println(eating);

    String play = bean.play();
    System.out.println(play);
}
  • 結(jié)果:
    傳入1
    Java設計模式-策略模式-基于Spring實現(xiàn)
    傳入2
    Java設計模式-策略模式-基于Spring實現(xiàn)
    傳入除了1/2的
    Java設計模式-策略模式-基于Spring實現(xiàn)

3、簡單工廠模式實現(xiàn)(推薦)

  • 加自定義Bean的名字

3.1、實現(xiàn)步奏

  • 可以看到,去獲取bean是交給工廠去做的,用戶只需要傳入類型即可。

Java設計模式-策略模式-基于Spring實現(xiàn)

3.2、實現(xiàn)

①定義策略接口

package com.cc.eed.strategy;

/**
 * <p>簡單工廠模式 - 實現(xiàn)的策略模式</p>
 *
 * @author CC
 * @since 2023/10/13
 */
public interface IFactoryStrategy {

    /**
     * 吃飯
     */
    String eating();

    /**
     * 玩
     */
    String play();
}

②生產(chǎn)策略bean的工廠

  • 由于使用的@Resource注解,BUSINESS_FACTORY會自動注入所有實現(xiàn)了IFactoryStrategy接口的Bean。@Resource注解是Spring提供的一種依賴注入的方式,它會根據(jù)類型進行自動裝配。在這個例子中,BUSINESS_FACTORY是一個Map類型的成員變量,它的鍵是字符串類型,值是IFactoryStrategy類型。當Spring容器啟動時,會掃描并找到所有實現(xiàn)了IFactoryStrategy接口的Bean,并將它們自動注入到BUSINESS_FACTORY中。
  • 由于BUSINESS_FACTORY使用了ConcurrentHashMap作為實現(xiàn),它會根據(jù)PirateEnum.values().length的大小來初始化容量。這樣可以確保BUSINESS_FACTORY的大小與實際注入的Bean數(shù)量一致,提高性能和效率。
package com.cc.eed.strategy;

import com.cc.eed.enums.PirateEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;

import javax.annotation.Resource;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * <p>簡單工廠</p>
 * <li>可以生產(chǎn)多個策略</li>
 *
 * @author CC
 * @since 2023/10/13
 */
@Component
public class StrategyByFactory {

    /**
     * 1、批量注入實現(xiàn)了 IFactoryStrategy 的Bean。
     * 2、用bean的數(shù)量當做map的大小
     */
    @Resource
    private final Map<String, IFactoryStrategy> BUSINESS_FACTORY = new ConcurrentHashMap<>(PirateEnum.values().length);

    //生成的策略...
    /** <p>根據(jù)類獲取不同的Bean<p>
     * @param type type
     * @return {@link IFactoryStrategy}
     * @since 2023/10/13
     * @author CC
     **/
    public IFactoryStrategy getBusinessMap(Integer type){
        Assert.notNull(type, "類型不能為空!");
        String beanName = PirateEnum.getBeanName(type);
        return BUSINESS_FACTORY.get(beanName);
    }

    //生成的其他策略...

}

③策略實現(xiàn)類1

package com.cc.eed.strategy.impl;

import com.cc.eed.enums.PirateEnum;
import com.cc.eed.strategy.IFactoryStrategy;
import org.springframework.stereotype.Component;

/**
 * <p>路飛</p>
 *
 * @author CC
 * @since 2023/10/13
 */
@Component(PirateEnum.LF_BEAN_NAME)
public class LuFeiFactoryStrategy implements IFactoryStrategy {
    /**
     * 吃飯
     */
    @Override
    public String eating() {
        return "路飛,吃飯!";
    }

    /**
     * 玩
     */
    @Override
    public String play() {
        return "路飛,玩!";
    }
}

③策略實現(xiàn)類2

package com.cc.eed.strategy.impl;

import com.cc.eed.enums.PirateEnum;
import com.cc.eed.strategy.IFactoryStrategy;
import org.springframework.stereotype.Component;

/**
 * <p>明哥</p>
 *
 * @author CC
 * @since 2023/10/13
 */
@Component(PirateEnum.MG_BEAN_NAME)
public class MingGgFactoryStrategy implements IFactoryStrategy {
    /**
     * 吃飯
     */
    @Override
    public String eating() {
        return "明哥,吃飯!";
    }

    /**
     * 玩
     */
    @Override
    public String play() {
        return "明哥,玩!";
    }
}

④定義beanName的枚舉

package com.cc.eed.enums;

import org.springframework.util.Assert;

import java.util.Arrays;

/**
 * <p></p>
 *
 * @author CC
 * @since 2023/10/13
 */
public enum PirateEnum {

    MG(11, "明哥", PirateEnum.MG_BEAN_NAME),

    LF(22, "路飛", PirateEnum.LF_BEAN_NAME)

    ;

    public Integer type;

    public String name;

    public String beanName;

    /**
     * 自定義的beanName
     */
    public static final String MG_BEAN_NAME = "mingGg_11";
    public static final String LF_BEAN_NAME = "luFei_22";

    /** <p>根據(jù)類型獲取beanName<p>
     * @param type type
     * @return {@link String}
     * @since 2023/10/13
     * @author CC
     **/
    public static String getBeanName(Integer type) {
        PirateEnum pirateEnum = Arrays.stream(values())
                .filter(p -> p.getType().equals(type))
                .findAny().orElse(null);
        Assert.notNull(pirateEnum, "暫不支持的策略模式!");
        return pirateEnum.getBeanName();
    }

    PirateEnum(Integer type, String name, String beanName) {
        this.type = type;
        this.name = name;
        this.beanName = beanName;
    }

    public Integer getType() {
        return type;
    }

    public void setType(Integer type) {
        this.type = type;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getBeanName() {
        return beanName;
    }

    public void setBeanName(String beanName) {
        this.beanName = beanName;
    }
}

⑤使用springBean工具類獲取beanName

  • 略,見:https://www.cnblogs.com/kakarotto-chen/p/17760069.html

⑥使用

  • 需要注入工廠來調(diào)用方法即可
    @Resource
    private StrategyByFactory strategyByFactory;

    @Test
    public void test03()throws Exception{
        //使用簡單工廠生產(chǎn)的策略模式 —— 明顯發(fā)現(xiàn)使用起來更簡單,把創(chuàng)建bean的權(quán)利交給了簡單工廠
        IFactoryStrategy businessMap = strategyByFactory.getBusinessMap(33);

        System.out.println(businessMap.eating());
        System.out.println(businessMap.play());

    }

結(jié)果:

  • 傳入:11
    Java設計模式-策略模式-基于Spring實現(xiàn)

  • 傳入:22
    Java設計模式-策略模式-基于Spring實現(xiàn)

  • 傳入:33
    Java設計模式-策略模式-基于Spring實現(xiàn)文章來源地址http://www.zghlxwxcb.cn/news/detail-711650.html

4、總結(jié)-工具類

  • 實現(xiàn)的重點在于獲取Spring的bean
  • 工具類:使用springBean工具類獲取beanName:
    見:https://www.cnblogs.com/kakarotto-chen/p/17760069.html
  • 項目:https://gitee.com/KakarottoChen/blog-code.git
    的:DesignDemo

到了這里,關(guān)于Java設計模式-策略模式-基于Spring實現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • Java設計模式之策略模式詳解

    大家好,我是免費搭建查券返利機器人賺傭金就用微賺淘客系統(tǒng)3.0的小編,也是冬天不穿秋褲,天冷也要風度的程序猿!今天,讓我們一同踏入Java設計模式之策略模式的世界,探討代碼中的智慧抉擇。 策略模式的核心思想 策略模式是一種行為型設計模式,它定義了算法家族

    2024年01月20日
    瀏覽(29)
  • Java特性之設計模式【策略模式】

    Java特性之設計模式【策略模式】

    概述 在策略模式(Strategy Pattern)中,一個類的行為或其算法可以在運行時更改。這種類型的設計模式屬于行為型模式 在策略模式中,我們創(chuàng)建表示各種策略的對象和一個行為隨著策略對象改變而改變的 context 對象。策略對象改變 context 對象的執(zhí)行算法 主要解決 :在有多種

    2024年02月08日
    瀏覽(32)
  • Java設計模式——策略

    前言 策略模式是平時Java開發(fā)中常用的一種,雖然已有很多講解設計模式的文章,但是這里還是寫篇文章來從自己理解的角度講解一下。 我們不妨進行場景假設,要對我們的軟件進行授權(quán)管理:在啟動我們的軟件之前先要校驗是否存在合法的授權(quán),如果授權(quán)不合法則要求用戶

    2024年02月20日
    瀏覽(19)
  • Java設計模式之策略(Strategy)模式

    策略(Strategy)設計模式定義了一系列算法,將它們封裝起來,并且可以相互替換使用,從而使得算法可以獨立于使用它的客戶而變化。 策略(Strategy)設計模式是一種行為型設計模式,它允許在運行時動態(tài)地選擇算法。策略模式將算法封裝為算法族,從而可以在運行時根據(jù)

    2024年02月15日
    瀏覽(33)
  • Java設計模式—策略模式(Strategy Mode)

    目錄 前言 一、策略模式的簡介 二、策略模式的概念 三、策略模式的作用 四、策略模式的優(yōu)、缺點 策略模式的優(yōu)點: 策略模式的缺點: 五、策略模式應用場景 六、代碼案例 1)抽象接口類 2)具體的策略類:減 3)具體策略類:打折 4)上下文類 5)客戶端Main代碼測試 總結(jié)

    2024年02月08日
    瀏覽(33)
  • 【設計模式】Head First 設計模式——策略模式 C++實現(xiàn)

    設計模式最大的作用就是在變化和穩(wěn)定中間尋找隔離點,然后分離它們,從而管理變化。將變化像小兔子一樣關(guān)到籠子里,讓它在籠子里隨便跳,而不至于跳出來把你整個房間給污染掉。 將行為想象為一族算法,定義算法族,分別封裝起來,讓他們之間可以互相替換,使得算

    2024年02月11日
    瀏覽(25)
  • Java 大廠八股文面試專題-設計模式 工廠方法模式、策略模式、責任鏈模式

    Java 大廠八股文面試專題-設計模式 工廠方法模式、策略模式、責任鏈模式

    ????????在平時的開發(fā)中,涉及到設計模式的有兩塊內(nèi)容,第一個是我們 平時使用的框架 (比如spring、mybatis等),第二個是我們自己開發(fā)業(yè)務使用的設計模式。 ????????面試官一般比較關(guān)心的是你在開發(fā)過程中, 有沒有使用過設計模式,或者你在簡歷上寫了關(guān)于設計

    2024年02月10日
    瀏覽(29)
  • 用Rust實現(xiàn)23種設計模式之 策略模式

    靈活性:策略模式允許你在運行時動態(tài)地選擇不同的算法或行為,而無需修改已有的代碼。 可擴展性:通過添加新的策略類,你可以輕松地擴展策略模式的功能。 可維護性:策略模式將不同的算法或行為封裝在各自的策略類中,使代碼更易于理解、維護和測試。 當有多個相

    2024年02月14日
    瀏覽(21)
  • 設計模式 -- 策略模式(傳統(tǒng)面向?qū)ο笈cJavaScript 的對比實現(xiàn))

    規(guī)則:根據(jù)員工的工資基數(shù)和年底績效情況計算年終獎 初級實現(xiàn) 缺點 多重 if else 違反開發(fā)-封閉原則,可維護性差 復用性差 使用組合函數(shù)重構(gòu)代碼 使用組合函數(shù)來重構(gòu)代碼,把各種算法封裝到一個個的小函數(shù)里面,這些小函數(shù)有著良好的命名,可以一目了然地知道它對應著

    2024年02月11日
    瀏覽(99)
  • 設計模式之【策略模式】,去掉繁瑣的if-else,實現(xiàn)算法的動態(tài)替換

    設計模式之【策略模式】,去掉繁瑣的if-else,實現(xiàn)算法的動態(tài)替換

    全網(wǎng)最全最細的【設計模式】總目錄,收藏起來慢慢啃,看完不懂砍我 策略模式(Strategy Pattern)又叫政策模式(Policy Pattern),它是將定義的算法家族分別封裝起來,讓它們之間可以互相替換,從而讓算法的變化不會影響到使用算法的用戶。屬于行為型模式。 策略模式使用

    2024年02月09日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包