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

Java設(shè)計模式之策略模式解析

 更新時間:2023年10月21日 10:23:24   作者:浪浪山的猿  
這篇文章主要介紹了Java設(shè)計模式之策略模式解析,在策略模式中,一個類的行為或其算法可以在運行時更改,這種類型的設(shè)計模式屬于行為型模式,需要的朋友可以參考下

一. 簡介

1. 什么是策略模式?

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

2. 策略模式的應用場景?

  • 如果在一個系統(tǒng)里面有許多類,它們之間的區(qū)別僅在于它們的行為,那么使用策略模式可以動態(tài)地讓一個對象在許多行為中選擇一種行為
  • 一個系統(tǒng)需要動態(tài)地在幾種算法中選擇一種
  • 如果一個對象有很多的行為,如果不用恰當?shù)哪J?,這些行為就只好使用多重的條件選擇語句來實現(xiàn)

二. 策略模式的使用

我們來模擬一個商城系統(tǒng)創(chuàng)建不同活動的需求,假設(shè)我們需要根據(jù)傳入的type來判斷創(chuàng)建所要創(chuàng)建的活動,傳統(tǒng)的方式我們可能或通過if()---else()的方式去判斷索要創(chuàng)建的活動類類型,如果類型多的話這樣的判斷就會顯得代碼很凌亂。那么我們可以嘗試著用策略模式去優(yōu)化這種邏輯。

下面我們模擬三種不同活動的創(chuàng)建

  • 創(chuàng)建策略枚舉類
/**
 * @author gf
 * @date 2023/2/7
 */
@Getter
@AllArgsConstructor
public enum ActivityTypeEnum {
 
    MANJIAN(101, "滿減活動"),
    MANZHE(102, "滿折活動"),
    PRESALE(103, "預售活動");
 
    int type;
 
    String desc;
 
}
  • 創(chuàng)建活動接口
/**
 * @author gf
 * @date 2023/2/7
 */
public interface ActivityService {
 
    /**
     * 創(chuàng)建活動
     *
     * @return
     */
    void createActivity();
 
    /**
     * 獲取訂單類型
     *
     * @return
     */
    ActivityTypeEnum type();
 
}
  • 創(chuàng)建活動實現(xiàn)類

接下來我們分別創(chuàng)建滿減,滿折和預售的實現(xiàn)類

  • 滿減實現(xiàn)類:
/**
 * @author gf
 * @date 2023/2/7
 */
@Slf4j
@Service
public class ManJianActivityImpl implements ActivityService {
    @Override
    public void createActivity() {
        log.info("----創(chuàng)建滿減活動----");
    }
 
    @Override
    public ActivityTypeEnum type() {
        return ActivityTypeEnum.MANJIAN;
    }
}
  • 滿折實現(xiàn)類:
/**
 * @author gf
 * @date 2023/2/7
 */
@Slf4j
@Service
public class ManZheActivityImpl implements ActivityService {
    @Override
    public void createActivity() {
        log.info("----創(chuàng)建滿折活動----");
    }
 
    @Override
    public ActivityTypeEnum type() {
        return ActivityTypeEnum.MANZHE;
    }
}
  • 預售實現(xiàn)類:
/**
 * @author gf
 * @date 2023/2/7
 */
@Slf4j
@Service
public class PreSaleActivityImpl implements ActivityService {
 
    @Override
    public void createActivity() {
        log.info("----創(chuàng)建預售活動----");
    }
 
    @Override
    public ActivityTypeEnum type() {
        return ActivityTypeEnum.PRESALE;
    }
}
  • 創(chuàng)建活動創(chuàng)建通用接口
/**
 * @author gf
 * @date 2023/2/7
 */
@RestController
public class ActivityController {
 
 
    @Autowired
    private List<ActivityService> activityService;
 
    /**
     * 創(chuàng)建活動
     *
     * @param type 活動類型
     * @return
     */
    public void createActivity(int type) {
        /**
         * 根據(jù)動類型,找到對應的處理器
         */
        Optional<ActivityService> any = activityService.stream().filter(f -> f.type().getType() == type).findAny();
        /**
         * 沒有對應的處理器
         */
        if (!any.isPresent()) {
            throw new RuntimeException("沒有找到相應的活動實現(xiàn)");
        }
        // 創(chuàng)建訂單
        any.get().createActivity();
    }
 
}

測試活動創(chuàng)建

@SpringBootTest
class DesignApplicationTests {
 
 
    @Autowired
    private ActivityController activityController;
 
    @Test
    void contextLoads() {
        activityController.createActivity(ActivityTypeEnum.MANJIAN.getType());
        
    }
 
}

搞定,看是不是很方便,省去了很多的if--else的判斷和接口的注入

三. 策略模式的優(yōu)缺點

優(yōu)點:

  • 算法可以自由切換;
  • 避免使用多重判斷;
  • 拓展性良好,增加一個策略只需要實現(xiàn)接口即可;

缺點:

  • 策略類數(shù)量會增多,每個策略都是一個類,復用性很??;
  • 所有的策略類都需要對外暴露

到此這篇關(guān)于Java設(shè)計模式之策略模式解析的文章就介紹到這了,更多相關(guān)Java策略模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MybatisGenerator文件生成不出對應文件的問題

    MybatisGenerator文件生成不出對應文件的問題

    本文介紹了使用MybatisGenerator生成文件時遇到的問題及解決方法,主要步驟包括檢查目標表是否存在、是否能連接到數(shù)據(jù)庫、配置生成器的路徑等,通過在項目結(jié)構(gòu)中引入相應的jar包,并在GeneratorSqlmap.java文件中運行,可以成功生成對應的文件
    2025-01-01
  • Java NIO ByteBuffer讀取文件方式

    Java NIO ByteBuffer讀取文件方式

    這篇文章主要介紹了Java NIO ByteBuffer讀取文件方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Spring在@ConditionalOnProperty注解使用詳解

    Spring在@ConditionalOnProperty注解使用詳解

    這篇文章主要介紹了Spring在@ConditionalOnProperty注解使用詳解,@ConditionalOnProperty注解是Spring Boot的條件注解,主要用法是根據(jù)配置文件中的屬性來控制某個配置類是否生效,或者控制某個Bean是否被創(chuàng)建,需要的朋友可以參考下
    2023-11-11
  • IntelliJ IDEA 中必有得插件和配置

    IntelliJ IDEA 中必有得插件和配置

    這篇文章主要介紹了IntelliJ IDEA 中必有得插件和配置,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • Java調(diào)用Python代碼實現(xiàn)Word轉(zhuǎn)化為PDF格式

    Java調(diào)用Python代碼實現(xiàn)Word轉(zhuǎn)化為PDF格式

    這篇文章主要為大家詳細介紹了Java如何實現(xiàn)調(diào)用Python代碼實現(xiàn)Word轉(zhuǎn)化為PDF格式,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2026-03-03
  • jedis連接池對commons-pool的封裝示例詳解

    jedis連接池對commons-pool的封裝示例詳解

    這篇文章主要為大家介紹了jedis連接池對commons-pool的封裝示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • Spring及Mybatis整合占位符解析失敗問題解決

    Spring及Mybatis整合占位符解析失敗問題解決

    這篇文章主要介紹了Spring及Mybatis整合占位符解析失敗問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • MyBatis-Plus代碼生成器的使用詳解

    MyBatis-Plus代碼生成器的使用詳解

    這篇文章主要介紹了MyBatis-Plus代碼生成器的使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • Spring的UnsatisfiedDependencyException異常的解決

    Spring的UnsatisfiedDependencyException異常的解決

    在使用Spring框架開發(fā)應用程序時,我們經(jīng)常會遇到各種異常,本文主要介紹了Spring的UnsatisfiedDependencyException異常的解決,感興趣的可以了解一下
    2023-11-11
  • 史上最全Java8日期時間工具類(分享)

    史上最全Java8日期時間工具類(分享)

    這篇文章主要介紹了史上最全Java8日期時間工具類(分享),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12

最新評論

扎鲁特旗| 嫩江县| 沙坪坝区| 博白县| 无棣县| 沁源县| 大连市| 盐津县| 滕州市| 黑龙江省| 甘泉县| 大冶市| 永泰县| 体育| 灵川县| 天门市| 永宁县| 中方县| 二手房| 仙桃市| 买车| 华宁县| 塔河县| 广南县| 凤阳县| 曲松县| 宝鸡市| 钟祥市| 辽阳市| 安陆市| 当涂县| 锦屏县| 崇礼县| 怀远县| 景德镇市| 灵武市| 舒城县| 株洲县| 黔西县| 阳高县| 长武县|