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

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

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

定義

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

解決的問題

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

核心要點(diǎn)

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

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

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

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

類圖

溢出效用

對父類的局部改動,會影響其他部分(子類)、會有溢出效應(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ù)具體的策略對象,調(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的具體算法,可以放到配置文件中。
    //運(yùn)行時(shí)讀取配置文件
    public static void main(String[] args) {
        Context context;
        //new 一個(gè)context對象
        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)了“開閉原則”??蛻舳嗽黾有袨椴挥眯薷脑写a,只要添加一種策略(或者行為)即可,避免了使用多重轉(zhuǎn)移語句(if…else if … else);

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

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

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

相關(guān)文章

最新評論

宝应县| 巴林左旗| 惠东县| 元氏县| 巴楚县| 同德县| 鄢陵县| 比如县| 云阳县| 锡林郭勒盟| 乐至县| 常山县| 毕节市| 康平县| 三门峡市| 大方县| 沽源县| 红原县| 晋城| 保康县| 双鸭山市| 嵊泗县| 台中县| 辽宁省| 南华县| 伊吾县| 石棉县| 务川| 高陵县| 武陟县| 遂溪县| 临清市| 富裕县| 永康市| 元氏县| 闸北区| 南华县| 北票市| 太仆寺旗| 乌兰察布市| 揭西县|