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

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

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

定義

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

解決的問題

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

核心要點

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

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

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

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

類圖

溢出效用

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

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

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

代碼實現(xiàn)

核心接口

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

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

}

實現(xiàn)類-三個

/**
 * 策略實現(xiàn)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實現(xiàn)");
    }
}

/**
 * 策略實現(xiàn)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實現(xiàn)");
    }
}


/**
 * 策略實現(xiàn)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實現(xiàn)");
    }
}

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

    //根據(jù)具體的策略對象,調(diào)用其算法的方法
    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()就是一個策略模式的抽象體現(xiàn)

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的初始化采用了策略模式,即不同類型的類采用不同的初始化策略。

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

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

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

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

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

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

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

相關(guān)文章

  • java  線程詳解及線程與進程的區(qū)別

    java 線程詳解及線程與進程的區(qū)別

    這篇文章主要介紹了java 線程詳解及線程與進程的區(qū)別的相關(guān)資料,網(wǎng)上關(guān)于java 線程的資料很多,對于進程的資料很是,這里就整理下,需要的朋友可以參考下
    2017-01-01
  • Spring Bean管理注解方式代碼實例

    Spring Bean管理注解方式代碼實例

    這篇文章主要介紹了Spring Bean管理注解方式代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • Spring MVC學習筆記之Controller查找(基于Spring4.0.3)

    Spring MVC學習筆記之Controller查找(基于Spring4.0.3)

    這篇文章主要給大家介紹了關(guān)于Spring MVC學習筆記之Controller查找(基于Spring4.0.3)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-03-03
  • java?spring?mvc處理器映射器介紹

    java?spring?mvc處理器映射器介紹

    這篇文章主要介紹了java?spring?mvc處理器映射器,文章圍繞equestMapping解析映射介紹展開源碼內(nèi)容,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-03-03
  • java多線程模擬實現(xiàn)售票功能

    java多線程模擬實現(xiàn)售票功能

    這篇文章主要為大家詳細介紹了java多線程模擬實現(xiàn)售票功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • java處理異常的機制關(guān)鍵字throw和throws使用解析

    java處理異常的機制關(guān)鍵字throw和throws使用解析

    這篇文章主要介紹了java處理異常的機制關(guān)鍵字throw和throws使用解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • Java 關(guān)鍵字static詳解及實例代碼

    Java 關(guān)鍵字static詳解及實例代碼

    這篇文章主要介紹了Java 關(guān)鍵字static詳解及實例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • MyBatis多對多一對多關(guān)系查詢嵌套處理

    MyBatis多對多一對多關(guān)系查詢嵌套處理

    這篇文章主要為大家介紹了MyBatis多對多一對多關(guān)系查詢嵌套處理示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • Spring學習之開發(fā)環(huán)境搭建的詳細步驟

    Spring學習之開發(fā)環(huán)境搭建的詳細步驟

    本篇文章主要介紹了Spring學習之開發(fā)環(huán)境搭建的詳細步驟,具有一定的參考價值,有興趣的可以了解一下
    2017-07-07
  • Java調(diào)用groovy實現(xiàn)原理代碼實例

    Java調(diào)用groovy實現(xiàn)原理代碼實例

    這篇文章主要介紹了Java調(diào)用groovy實現(xiàn)原理代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-12-12

最新評論