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

深入了解Java設(shè)計(jì)模式之策略模式

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

定義

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

解決的問題

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

核心要點(diǎn)

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

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

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

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

類圖

溢出效用

對(duì)父類的局部改動(dòng),會(huì)影響其他部分(子類)、會(huì)有溢出效應(yīng)

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

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

代碼實(shí)現(xiàn)

核心接口

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

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

}

實(shí)現(xiàn)類-三個(gè)

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

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


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

Context類

/**
 * 策略配置類,維護(hù)一個(gè)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方法,支持運(yùn)行時(shí)改變算法
    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }

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

Main方法

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

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

}

拓展

JDK源碼

Comparator接口是一個(gè)常用的比較器,其中compare()就是一個(gè)策略模式的抽象體現(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的初始化采用了策略模式,即不同類型的類采用不同的初始化策略。

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

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

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

3)體現(xiàn)了“開閉原則”。客戶端增加行為不用修改原有代碼,只要添加一種策略(或者行為)即可,避免了使用多重轉(zhuǎn)移語句(if…else if … else);

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

5)需要注意的是 :每添加一個(gè)策略就要增加一個(gè)類,當(dāng)策略過多是會(huì)導(dǎo)致類數(shù)目龐大。

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

相關(guān)文章

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

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

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

    Spring Bean管理注解方式代碼實(shí)例

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新評(píng)論