国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Gof23設(shè)計(jì)模式之策略模式

這篇具有很好參考價(jià)值的文章主要介紹了Gof23設(shè)計(jì)模式之策略模式。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1.概述

該模式定義了一系列算法,并將每個(gè)算法封裝起來,使它們可以相互替換,且算法的變化不會(huì)影響使用算法的客戶。策略模式屬于對象行為模式,它通過對算法進(jìn)行封裝,把使用算法的責(zé)任和算法的實(shí)現(xiàn)分割開來,并委派給不同的對象對這些算法進(jìn)行管理。

2.結(jié)構(gòu)

策略模式的主要角色如下:

  • 抽象策略(Strategy)類:這是一個(gè)抽象角色,通常由一個(gè)接口或抽象類實(shí)現(xiàn)。此角色給出所有的具體策略類所需的接口。
  • 具體策略(Concrete Strategy)類:實(shí)現(xiàn)了抽象策略定義的接口,提供具體的算法實(shí)現(xiàn)或行為。
  • 環(huán)境(Context)類:持有一個(gè)策略類的引用,最終給客戶端調(diào)用。

3.案例

/**
 * @author 曉風(fēng)殘?jiān)翷x
 * @date 2023/7/26 19:56
 *      抽象策略類
 */
public interface Strategy {

    void show();
}

/**
 * @author 曉風(fēng)殘?jiān)翷x
 * @date 2023/7/26 19:59
 *      具體策略類
 */
public class StrategyA implements Strategy{
    @Override
    public void show() {
        System.out.println("策略1");
    }
}


/**
 * @author 曉風(fēng)殘?jiān)翷x
 * @date 2023/7/26 19:59
 *      具體策略類
 */
public class StrategyB implements Strategy{
    @Override
    public void show() {
        System.out.println("策略2");
    }
}


/**
 * @author 曉風(fēng)殘?jiān)翷x
 * @date 2023/7/26 19:59
 *      具體策略類
 */
public class StrategyC implements Strategy{
    @Override
    public void show() {
        System.out.println("策略3");
    }
}


/**
 * @author 曉風(fēng)殘?jiān)翷x
 * @date 2023/7/26 20:00
 *      促銷員(環(huán)境類)
 */
public class SalesMan {

    // 聚合策略類對象
    private Strategy strategy;

    public Strategy getStrategy() {
        return strategy;
    }

    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }

    public SalesMan(Strategy strategy) {
        this.strategy = strategy;
    }

    // 由促銷員展示促銷活動(dòng)給用戶
    public void salesManShow() {
        strategy.show();
    }

}

/**
 * @author 曉風(fēng)殘?jiān)翷x
 * @date 2023/7/26 20:02
 */
public class Client {

    public static void main(String[] args) {

        SalesMan salesMan = new SalesMan(new StrategyA());
        salesMan.salesManShow();


        salesMan.setStrategy(new StrategyC());
        salesMan.salesManShow();

    }
}

Gof23設(shè)計(jì)模式之策略模式,Java設(shè)計(jì)模式,設(shè)計(jì)模式,策略模式

4.優(yōu)缺點(diǎn)

1,優(yōu)點(diǎn):

  • 策略類之間可以自由切換

    由于策略類都實(shí)現(xiàn)同一個(gè)接口,所以使它們之間可以自由切換。

  • 易于擴(kuò)展

    增加一個(gè)新的策略只需要添加一個(gè)具體的策略類即可,基本不需要改變原有的代碼,符合“開閉原則“

  • 避免使用多重條件選擇語句(if else),充分體現(xiàn)面向?qū)ο笤O(shè)計(jì)思想。

2,缺點(diǎn):

  • 客戶端必須知道所有的策略類,并自行決定使用哪一個(gè)策略類。
  • 策略模式將造成產(chǎn)生很多策略類,可以通過使用享元模式在一定程度上減少對象的數(shù)量。

5.使用場景

  • 一個(gè)系統(tǒng)需要?jiǎng)討B(tài)地在幾種算法中選擇一種時(shí),可將每個(gè)算法封裝到策略類中。
  • 一個(gè)類定義了多種行為,并且這些行為在這個(gè)類的操作中以多個(gè)條件語句的形式出現(xiàn),可將每個(gè)條件分支移入它們各自的策略類中以代替這些條件語句。
  • 系統(tǒng)中各算法彼此完全獨(dú)立,且要求對客戶隱藏具體算法的實(shí)現(xiàn)細(xì)節(jié)時(shí)。
  • 系統(tǒng)要求使用算法的客戶不應(yīng)該知道其操作的數(shù)據(jù)時(shí),可使用策略模式來隱藏與算法相關(guān)的數(shù)據(jù)結(jié)構(gòu)。
  • 多個(gè)類只區(qū)別在表現(xiàn)行為不同,可以使用策略模式,在運(yùn)行時(shí)動(dòng)態(tài)選擇具體要執(zhí)行的行為。

6.JDK源碼解析

Comparator 中的策略模式。在Arrays類中有一個(gè) sort() 方法,如下:

public class Arrays{
    public static <T> void sort(T[] a, Comparator<? super T> c) {
        if (c == null) {
            sort(a);
        } else {
            if (LegacyMergeSort.userRequested)
                legacyMergeSort(a, c);
            else
                TimSort.sort(a, 0, a.length, c, null, 0, 0);
        }
    }
}

Arrays就是一個(gè)環(huán)境角色類,這個(gè)sort方法可以傳一個(gè)新策略讓Arrays根據(jù)這個(gè)策略來進(jìn)行排序。就比如下面的測試類。

public class demo {
    public static void main(String[] args) {

        Integer[] data = {12, 2, 3, 2, 4, 5, 1};
        // 實(shí)現(xiàn)降序排序
        Arrays.sort(data, new Comparator<Integer>() {
            public int compare(Integer o1, Integer o2) {
                return o2 - o1;
            }
        });
        System.out.println(Arrays.toString(data)); //[12, 5, 4, 3, 2, 2, 1]
    }
}

這里我們在調(diào)用Arrays的sort方法時(shí),第二個(gè)參數(shù)傳遞的是Comparator接口的子實(shí)現(xiàn)類對象。所以Comparator充當(dāng)?shù)氖浅橄蟛呗越巧?,而具體的子實(shí)現(xiàn)類充當(dāng)?shù)氖蔷唧w策略角色。環(huán)境角色類(Arrays)應(yīng)該持有抽象策略的引用來調(diào)用。那么,Arrays類的sort方法到底有沒有使用Comparator子實(shí)現(xiàn)類中的 compare() 方法嗎?讓我們繼續(xù)查看TimSort類的 sort() 方法,代碼如下:

class TimSort<T> {
    static <T> void sort(T[] a, int lo, int hi, Comparator<? super T> c,
                         T[] work, int workBase, int workLen) {
        assert c != null && a != null && lo >= 0 && lo <= hi && hi <= a.length;

        int nRemaining  = hi - lo;
        if (nRemaining < 2)
            return;  // Arrays of size 0 and 1 are always sorted

        // If array is small, do a "mini-TimSort" with no merges
        if (nRemaining < MIN_MERGE) {
            int initRunLen = countRunAndMakeAscending(a, lo, hi, c);
            binarySort(a, lo, hi, lo + initRunLen, c);
            return;
        }
        ...
    }   
        
    private static <T> int countRunAndMakeAscending(T[] a, int lo, int hi,Comparator<? super T> c) {
        assert lo < hi;
        int runHi = lo + 1;
        if (runHi == hi)
            return 1;

        // Find end of run, and reverse range if descending
        if (c.compare(a[runHi++], a[lo]) < 0) { // Descending
            while (runHi < hi && c.compare(a[runHi], a[runHi - 1]) < 0)
                runHi++;
            reverseRange(a, lo, runHi);
        } else {                              // Ascending
            while (runHi < hi && c.compare(a[runHi], a[runHi - 1]) >= 0)
                runHi++;
        }

        return runHi - lo;
    }
}

上面的代碼中最終會(huì)跑到 countRunAndMakeAscending() 這個(gè)方法中。我們可以看見,只用了compare方法,所以在調(diào)用Arrays.sort方法只傳具體compare重寫方法的類對象就行,這也是Comparator接口中必須要子類實(shí)現(xiàn)的一個(gè)方法。文章來源地址http://www.zghlxwxcb.cn/news/detail-705350.html

到了這里,關(guān)于Gof23設(shè)計(jì)模式之策略模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Gof23設(shè)計(jì)模式之橋接外觀模式

    又名門面模式,是一種通過為多個(gè)復(fù)雜的子系統(tǒng)提供一個(gè)一致的接口,而使這些子系統(tǒng)更加容易被訪問的模式。該模式對外有一個(gè)統(tǒng)一接口,外部應(yīng)用程序不用關(guān)心內(nèi)部子系統(tǒng)的具體的細(xì)節(jié),這樣會(huì)大大降低應(yīng)用程序的復(fù)雜度,提高了程序的可維護(hù)性。 外觀(Facade)模式包含

    2024年02月15日
    瀏覽(22)
  • Gof23設(shè)計(jì)模式之建造者模式

    建造者模式(Builder Pattern)又叫生成器模式,是一種對象構(gòu)建模式。它可以將復(fù)雜對象的建造過程抽象出來(抽象類別),使這個(gè)抽象過程的不同實(shí)現(xiàn)方法可以構(gòu)造出不同表現(xiàn)(屬性)的對象。 建造者模式是一步一步創(chuàng)建一個(gè)復(fù)雜的對象,它允許用戶只通過指定復(fù)雜對象的類型和

    2024年02月11日
    瀏覽(33)
  • Gof23設(shè)計(jì)模式之模板方法模式

    定義一個(gè)操作中的算法骨架,而將算法的一些步驟延遲到子類中,使得子類可以不改變該算法結(jié)構(gòu)的情況下重定義該算法的某些特定步驟。 模板方法(Template Method)模式包含以下主要角色: 抽象類(Abstract Class):負(fù)責(zé)給出一個(gè)算法的輪廓和骨架。它由一個(gè)模板方法和若干個(gè)

    2024年02月13日
    瀏覽(20)
  • Gof23設(shè)計(jì)模式之單例模式(完整)

    單例模式(Singleton pattern)是Java中最簡單的設(shè)計(jì)模式之一。這種設(shè)計(jì)模式屬于創(chuàng)建型模型,它提供了一種創(chuàng)建對象的最佳方式。 這種模式涉及到一個(gè)單一的類,該類負(fù)責(zé)創(chuàng)建自己的對象,同時(shí)確保只有單個(gè)對象被創(chuàng)建。這個(gè)類提供了一種訪問其唯一的對象的方式,可以直接訪

    2024年02月10日
    瀏覽(26)
  • GOF 23 種設(shè)計(jì)模式應(yīng)用場景分析

    本文看下GOF 23 種設(shè)計(jì)模式應(yīng)用場景,詳細(xì)的還是通過文章給出參考鏈接學(xué)習(xí)下。 參考這篇文章 。 有幾種產(chǎn)品需要?jiǎng)?chuàng)建,比如創(chuàng)建紅蘋果,青蘋果,綠蘋果,這些對象通過一個(gè)對象就可以。 參考這篇文章 。 有幾種產(chǎn)品需要?jiǎng)?chuàng)建,但是每種產(chǎn)品不能簡單的通過一個(gè)對象來表示

    2024年02月16日
    瀏覽(28)
  • 創(chuàng)建型模式 (Creational Patterns) 玄子Share 設(shè)計(jì)模式 GOF 全23種 + 七大設(shè)計(jì)原則

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-NWLAOFtO-1691793071647)(./assets/%E7%8E%84%E5%AD%90Share%20%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%20GOF%20%E5%85%A823%E7%A7%8D%20+%20%E4%B8%83%E5%A4%A7%E8%AE%BE%E8%AE%A1%E5%8E%9F%E5%88%99.png)] GoF(Gang of Four)是四位計(jì)算機(jī)科學(xué)家(Erich Gamma、Ri

    2024年02月12日
    瀏覽(27)
  • 【設(shè)計(jì)模式——學(xué)習(xí)筆記】23種設(shè)計(jì)模式——策略模式Strategy(原理講解+應(yīng)用場景介紹+案例介紹+Java代碼實(shí)現(xiàn))

    【設(shè)計(jì)模式——學(xué)習(xí)筆記】23種設(shè)計(jì)模式——策略模式Strategy(原理講解+應(yīng)用場景介紹+案例介紹+Java代碼實(shí)現(xiàn))

    有各種鴨子,比如野鴨、北京鴨、水鴨等。 鴨子有各種行為,比如走路、叫、飛行等。不同鴨子的行為可能略有不同。要求顯示鴨子的信息 不同的鴨子繼承一個(gè)父類Duck,如果是相同的行為就繼承,不同行為就重寫方法 實(shí)現(xiàn) 【鴨子抽象類】 【野鴨】 【北京鴨】 【玩具鴨】

    2024年02月12日
    瀏覽(34)
  • 用Rust實(shí)現(xiàn)23種設(shè)計(jì)模式之 策略模式

    靈活性:策略模式允許你在運(yùn)行時(shí)動(dòng)態(tài)地選擇不同的算法或行為,而無需修改已有的代碼。 可擴(kuò)展性:通過添加新的策略類,你可以輕松地?cái)U(kuò)展策略模式的功能。 可維護(hù)性:策略模式將不同的算法或行為封裝在各自的策略類中,使代碼更易于理解、維護(hù)和測試。 當(dāng)有多個(gè)相

    2024年02月14日
    瀏覽(21)
  • java 23種設(shè)計(jì)模式

    java 23種設(shè)計(jì)模式

    1、創(chuàng)建型模式(Creational Patterns) 2、結(jié)構(gòu)型模式(Structural Patterns) 3、行為型模式(Behavioral Patterns) 創(chuàng)建型模式(Creational Patterns): ? ? ? ? 1、工廠方法模式(Factory Method Pattern) ? ? ? ? ? ? ? 1.1、簡單工廠模式(Simple Factory Pattern) ? ? ? ? 2、抽象工廠模式(Abstract

    2024年01月22日
    瀏覽(25)
  • Java23種設(shè)計(jì)模式之【單例模式】

    Java23種設(shè)計(jì)模式之【單例模式】

    目錄 一.單例模式的起源,和應(yīng)用場景 1.單例模式的前世今生! ?2.什么是單例模式? 2.1使用單例模式的注意事項(xiàng) 2.2如何理解單例模式? 2.3單例模式的優(yōu)勢以及不足! 2.4使用場景 二.實(shí)現(xiàn) 1.實(shí)現(xiàn)思路 1.1創(chuàng)建一個(gè) Singleton 類 (SingleObject.java) 1.2從 singleton 類獲取唯一的對象 (Sing

    2024年02月10日
    瀏覽(33)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包