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

深入了解Java設計模式之策略模式

 更新時間:2022年09月07日 09:02:22   作者:小小張自由—>張有博  
策略模式屬于Java-設計模式中行為模式之一,該模式定義了一系列算法,并將每個算法封裝起來,使它們可以相互替換。本文將通過示例詳細講解這一模式,需要的可以參考一下

定義

定義了算法家族,分別封裝起來,讓他們之間可以相互替換,此模式讓算法的變化,不會影響到使用算法的客戶。

解決的問題

在有多種算法相似的情況下,使用 if…else 所帶來的復雜和難以維護。

核心要點

把變化的代碼從不變的代碼中分離出來

針對接口編程而不是具體實現(類)

多用組合/聚合,少用繼承

客戶端通過組合的方式使用策略

類圖

溢出效用

對父類的局部改動,會影響其他部分(子類)、會有溢出效應

策略模式避免使用多重條件語句,比如if-else語句、Swtich語句

缺點:客戶端必須知道所有的策略類,并且自行決定使用哪一個策略類。

代碼實現

核心接口

/**
 * 策略接口
 *
 * @author Promsing(張有博)
 * @version 1.0.0
 * @since 2022/9/6 - 18:13
 */
public interface Strategy {

    //頂層策略接口
    void Strategy();

}

實現類-三個

/**
 * 策略實現A
 *
 * @author Promsing(張有博)
 * @version 1.0.0
 * @since 2022/9/6 - 18:14
 */
public class ConcreteStrategyA  implements Strategy{

    @Override
    public void Strategy() {
        System.out.println("算法A實現");
    }
}

/**
 * 策略實現B
 *
 * @author Promsing(張有博)
 * @version 1.0.0
 * @since 2022/9/6 - 18:14
 */
public class ConcreteStrategyB implements Strategy {
    @Override
    public void Strategy() {
        System.out.println("算法B實現");
    }
}


/**
 * 策略實現C
 *
 * @author Promsing(張有博)
 * @version 1.0.0
 * @since 2022/9/6 - 18:14
 */
public class ConcreteStrategyC implements Strategy{

    @Override
    public void Strategy() {
        System.out.println("算法C實現");
    }
}

Context類

/**
 * 策略配置類,維護一個Strategy的引用
 *
 * @author Promsing(張有博)
 * @version 1.0.0
 * @since 2022/9/6 - 18:15
 */
public class Context {

    //聲明策略接口
    private Strategy strategy;

    //使用聚合的方式
    public Context(Strategy strategy) {
        this.strategy = strategy;
    }
    
    //提供set方法,支持運行時改變算法
    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }

    //根據具體的策略對象,調用其算法的方法
    public void ContextStrategy(){
        strategy.Strategy();
    }
   
}

Main方法

/**
 * 策略模式啟動類
 *
 * @author Promsing(張有博)
 * @version 1.0.0
 * @since 2022/9/6 - 18:19
 */
public class Main
{
    //TODO:代碼可以優(yōu)化,new的具體算法,可以放到配置文件中。
    //運行時讀取配置文件
    public static void main(String[] args) {
        Context context;
        //new 一個context對象
        context=new Context(new ConcreteStrategyA());
        context.ContextStrategy();
        
        //運行時改變策略
        context.setStrategy(new ConcreteStrategyB());
        context.ContextStrategy();

        context.setStrategy(new ConcreteStrategyC());
        context.ContextStrategy();
    }

}

拓展

JDK源碼

Comparator接口是一個常用的比較器,其中compare()就是一個策略模式的抽象體現

public static void main2(String[] args) {
        Integer[] ints={1,3,8,2,4,9,0};

        Comparator<Integer> comparator = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                if (o1 > o2) {
                    return 1;
                }
                return -1;
            }
        };

        Arrays.sort(ints,comparator);

        System.out.println(Arrays.toString(ints));

 }

Spring源碼

Spring的初始化采用了策略模式,即不同類型的類采用不同的初始化策略。

策略模式的注意實現和細節(jié)

1)策略模式的關鍵是 :分析項目中變化部分與不變部分

2)策略模式的核心思想是 :多用組合/聚合,少用繼承;用行為類組合,而不是行為的繼承。更有彈性。

3)體現了“開閉原則”??蛻舳嗽黾有袨椴挥眯薷脑写a,只要添加一種策略(或者行為)即可,避免了使用多重轉移語句(if…else if … else);

4)提供了可以替換繼承關心的辦法 :策略模式將算法封裝在獨立的Strategy類中使得你可以獨立于其Context改變它,使它易于切換、易于理解、易于擴展。

5)需要注意的是 :每添加一個策略就要增加一個類,當策略過多是會導致類數目龐大。

以上就是深入了解Java設計模式之策略模式的詳細內容,更多關于Java策略模式的資料請關注腳本之家其它相關文章!

相關文章

  • java連接mysql數據庫的方法

    java連接mysql數據庫的方法

    這篇文章主要為大家詳細介紹了java連接mysql數據庫的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Java應用程序開發(fā)學習之static關鍵字應用

    Java應用程序開發(fā)學習之static關鍵字應用

    今天小編就為大家分享一篇關于Java應用程序開發(fā)學習之static關鍵字應用,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Spring?MVC中的常用注解及用法小結

    Spring?MVC中的常用注解及用法小結

    這篇文章主要介紹了Spring?MVC中的常用注解及其用法,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2024-02-02
  • JavaWeb頁面中防止點擊Backspace網頁后退情況

    JavaWeb頁面中防止點擊Backspace網頁后退情況

    當鍵盤敲下后退鍵(Backspace)后怎么防止網頁后退情況呢?今天小編通過本文給大家詳細介紹下,感興趣的朋友一起看看吧
    2016-11-11
  • 基于SpringBoot應用監(jiān)控Actuator安全隱患及解決方式

    基于SpringBoot應用監(jiān)控Actuator安全隱患及解決方式

    這篇文章主要介紹了SpringBoot應用監(jiān)控Actuator安全隱患及解決方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • SpringBoot啟動失敗的原因及其解決方法

    SpringBoot啟動失敗的原因及其解決方法

    對于springboot的啟動失敗,相信大家都有經歷,但是為什么會啟動失敗,以及怎么解決都只能通過日志進行查看,在這里,我會將常見的springboot啟動失敗的報錯一一展示,需要的朋友可以參考下
    2024-06-06
  • Java 深入分析鏈表面試實例題目

    Java 深入分析鏈表面試實例題目

    鏈表是一種物理存儲單元上非連續(xù)、非順序的存儲結構,數據元素的邏輯順序是通過鏈表中的指針鏈接次序實現的,本篇帶你通過兩個實例題目來深入探索
    2022-03-03
  • Java圖形化編程中的鍵盤事件設計簡介

    Java圖形化編程中的鍵盤事件設計簡介

    這篇文章主要介紹了Java圖形化編程中的鍵盤事件設計,是Java的GUI編程當中的基礎部分,需要的朋友可以參考下
    2015-10-10
  • Java?SE判斷兩個文件內容是否相同的多種方法代碼

    Java?SE判斷兩個文件內容是否相同的多種方法代碼

    昨天因為要幫師兄的忙所以看了一下如何判斷兩個文件內容是否相同,這里給大家總結下,這篇文章主要給大家介紹了關于Java?SE判斷兩個文件內容是否相同的多種方法,需要的朋友可以參考下
    2023-11-11
  • springboot+mybatis+redis 二級緩存問題實例詳解

    springboot+mybatis+redis 二級緩存問題實例詳解

    Mybatis默認沒有開啟二級緩存,需要在全局配置(mybatis-config.xml)中開啟二級緩存。本文講述的是使用Redis作為緩存,與springboot、mybatis進行集成的方法。需要的朋友參考下吧
    2017-12-12

最新評論

南丰县| 曲沃县| 海晏县| 彝良县| 承德市| 乡宁县| 德庆县| 洞口县| 陵川县| 扎鲁特旗| 平和县| 高尔夫| 辉南县| 嵩明县| 建瓯市| 伽师县| 普洱| 莱芜市| 马关县| 威宁| 旺苍县| 肥乡县| 湖南省| 都江堰市| 高州市| 宝鸡市| 和龙市| 招远市| 四会市| 宣汉县| 志丹县| 五莲县| 河北区| 山阳县| 富川| 嘉义县| 融水| 建宁县| 黄大仙区| 广灵县| 高密市|