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

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

 更新時(shí)間:2022年05月16日 09:51:27   作者:行萬(wàn)里路,讀萬(wàn)卷書(shū)  
策略模式屬于Java 23種設(shè)計(jì)模式中行為模式之一,該模式定義了一系列算法,并將每個(gè)算法封裝起來(lái),使它們可以相互替換,且算法的變化不會(huì)影響使用算法的客戶。本文將通過(guò)示例詳細(xì)講解這一模式,需要的可以參考一下

1.基本介紹

1)策略模式(Strategy Pattern)中,定義算法族(策略組),分別封裝起來(lái),讓他們之間可以互相替換,此模式讓算法的變化獨(dú)立于使用算法的客戶

2)這算法體現(xiàn)了幾個(gè)設(shè)計(jì)原則,第一,把變化的代碼從不變的代碼中分離出來(lái);第二,針對(duì)接口編程而不是具體類(定義了策略接口);第三,多用組合/聚合,少用繼承(客戶通過(guò)組合方式使用策略)

例如:針對(duì)環(huán)境節(jié)能,提出了三種節(jié)能方式:基帶板節(jié)能,SPC節(jié)能,產(chǎn)品節(jié)能,不同的節(jié)能方式,對(duì)環(huán)境設(shè)備的具體處理流程不同

2.傳統(tǒng)方式

(1)類圖

(2)編碼實(shí)現(xiàn)

1)定義一個(gè)EsPolicy抽象類,定義esPolicyHandler方法

public abstract class EsPolicy {
    public void esPolicyHandler() {
    }
}

2)BbEsPolicy繼承EsPolicy,并復(fù)寫(xiě)esPolicyHandler方法

public class BbEsPolicy extends EsPolicy {
    @Override
    public void esPolicyHandler() {
        System.out.println("===處理基帶板節(jié)能策略===");
    }
}

3)SpcEsPolicy繼承EsPolicy,并復(fù)寫(xiě)esPolicyHandler方法

public class SpcEsPolicy extends EsPolicy {
    @Override
    public void esPolicyHandler() {
        System.out.println("===Spc節(jié)能策略處理===");
    }
}

4)ProdEsPolicy繼承EsPolicy,并復(fù)寫(xiě)esPolicyHandler方法

public class ProdEsPolicy extends EsPolicy {
    @Override
    public void esPolicyHandler() {
        System.out.println("===產(chǎn)品節(jié)能策略處理===");
    }
}

5)測(cè)試

public class EsPolicyTest {
    public static void main(String[] args) {
        EsPolicy bbEsPolicy = new BbEsPolicy();
        bbEsPolicy.esPolicyHandler();
        SpcEsPolicy spcEsPolicy = new SpcEsPolicy();
        spcEsPolicy.esPolicyHandler();
        ProdEsPolicy prodPolicy = new ProdEsPolicy();
        prodPolicy.esPolicyHandler();
    }
}

執(zhí)行結(jié)果

===處理基帶板節(jié)能策略===
===Spc節(jié)能策略處理===
===產(chǎn)品節(jié)能策略處理===

問(wèn)題:傳統(tǒng)方法是通過(guò)子類繼承父類并復(fù)寫(xiě)父類方法來(lái)實(shí)現(xiàn)不同子類的不同行為,對(duì)類的局部改動(dòng),尤其是超類的局部改動(dòng),會(huì)影響其它部分,會(huì)有溢出效應(yīng)

3.采用策略模式

(1)類圖

(2)編碼實(shí)現(xiàn)

1)定義策略接口并定義抽象方法

public interface EsPolicyHandler {
    void esPolicyHandler();
}

2)BbEsPolicyHandler實(shí)現(xiàn)策略接口,并實(shí)現(xiàn)esPolicyHandler方法

public class BbEsPolicyHandler implements EsPolicyHandler {
    @Override
    public void esPolicyHandler() {
        System.out.println("===基帶板節(jié)能策略處理===");
    }
}

3)SpcEsPolicyHandler實(shí)現(xiàn)策略接口,并實(shí)現(xiàn)esPolicyHandler方法

public class SpcEsPolicyHandler implements EsPolicyHandler {
    @Override
    public void esPolicyHandler() {
        System.out.println("===Spc節(jié)能策略處理===");
    }
}

4)ProdEsPolicyHandler實(shí)現(xiàn)策略接口,并實(shí)現(xiàn)esPolicyHandler方法

public class ProdEsPolicyHandler implements EsPolicyHandler {
    @Override
    public void esPolicyHandler() {
        System.out.println("===產(chǎn)品節(jié)能策略處理===");
    }
}

5)定義EsPolicy抽象類,注入EsPolicyHandler作為其屬性

public abstract class EsPolicy {
    EsPolicyHandler esPolicyHandler;
    public void setEsPolicyHandler(EsPolicyHandler esPolicyHandler) {
        this.esPolicyHandler = esPolicyHandler;
    }
    public void esPolicyHandler() {
        if (null != esPolicyHandler) {
            esPolicyHandler.esPolicyHandler();
        }
    }
}

6)BbEsPolicy繼承EsPolicy,在構(gòu)造方法中實(shí)例化esPolicyHandler接口屬性

public class BbEsPolicy extends EsPolicy {
    public BbEsPolicy() {
        esPolicyHandler = new BbEsPolicyHandler();
    }
}

7)SpcEsPolicy繼承EsPolicy,在構(gòu)造方法中實(shí)例化esPolicyHandler接口屬性

public class SpcEsPolicy extends EsPolicy {
    public SpcEsPolicy() {
        esPolicyHandler = new SpcEsPolicyHandler();
    }
}

8)ProdEsPolicy繼承EsPolicy,在構(gòu)造方法中實(shí)例化esPolicyHandler接口屬性

public class ProdEsPolicy extends EsPolicy {
    public ProdEsPolicy() {
        esPolicyHandler = new ProdEsPolicyHandler();
    }
}

9)測(cè)試

public class EsPolicyTest {
    public static void main(String[] args) {
        BbEsPolicy bbEsPolicy = new BbEsPolicy();
        bbEsPolicy.esPolicyHandler();
        SpcEsPolicy spcEsPolicy = new SpcEsPolicy();
        spcEsPolicy.esPolicyHandler();
        ProdEsPolicy prodEsPolicy = new ProdEsPolicy();
        prodEsPolicy.esPolicyHandler();
    }
}

10)執(zhí)行結(jié)果

===處理基帶板節(jié)能策略===
===Spc節(jié)能策略處理===
===產(chǎn)品節(jié)能策略處理===

4.策略模式的注意事項(xiàng)和細(xì)節(jié)

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

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

3)體現(xiàn)了“對(duì)修改關(guān)閉,對(duì)擴(kuò)展開(kāi)放”原則,客戶端增加行為而不用修改原有的代碼,只要添加一種策略(或者行為)即可,避免了使用多重轉(zhuǎn)移語(yǔ)句(if…else if…else)

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

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

到此這篇關(guān)于Java設(shè)計(jì)模式之策略模式示例詳解的文章就介紹到這了,更多相關(guān)Java策略模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 學(xué)習(xí)Java HashMap,看這篇就夠了

    學(xué)習(xí)Java HashMap,看這篇就夠了

    這篇文章主要介紹了Java HashMap的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • 詳解SpringMVC @RequestBody接收J(rèn)son對(duì)象字符串

    詳解SpringMVC @RequestBody接收J(rèn)son對(duì)象字符串

    這篇文章主要介紹了詳解SpringMVC @RequestBody接收J(rèn)son對(duì)象字符串,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • SpringBoot中支持Https協(xié)議的實(shí)現(xiàn)

    SpringBoot中支持Https協(xié)議的實(shí)現(xiàn)

    本文主要介紹了SpringBoot中支持Https協(xié)議的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • 重學(xué)SpringBoot3之如何發(fā)送Email郵件功能

    重學(xué)SpringBoot3之如何發(fā)送Email郵件功能

    這篇文章主要給大家介紹了重學(xué)SpringBoot3之如何發(fā)送Email郵件功能的相關(guān)資料,文中包括環(huán)境準(zhǔn)備、項(xiàng)目配置、代碼實(shí)現(xiàn)、最佳實(shí)踐和安全性建議,通過(guò)采用異步發(fā)送、重試機(jī)制、限流等最佳實(shí)踐,可以構(gòu)建一個(gè)健壯的郵件發(fā)送系統(tǒng),需要的朋友可以參考下
    2024-11-11
  • java中@ModelAttribute注解的作用

    java中@ModelAttribute注解的作用

    本文主要介紹了java中@ModelAttribute注解的作用。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02
  • Java實(shí)現(xiàn)彈窗效果的基本操作(2)

    Java實(shí)現(xiàn)彈窗效果的基本操作(2)

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)彈窗效果的基本操作第二篇,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Java常見(jiàn)數(shù)據(jù)結(jié)構(gòu)面試題(帶答案)

    Java常見(jiàn)數(shù)據(jù)結(jié)構(gòu)面試題(帶答案)

    這篇文章主要介紹了Java常見(jiàn)數(shù)據(jù)結(jié)構(gòu)面試題,帶有答案及解釋,希望對(duì)廣大的程序愛(ài)好者有所幫助,同時(shí)祝大家有一個(gè)好成績(jī),需要的朋友可以參考下。
    2017-09-09
  • java獲取兩個(gè)數(shù)組中不同數(shù)據(jù)的方法

    java獲取兩個(gè)數(shù)組中不同數(shù)據(jù)的方法

    這篇文章主要介紹了java獲取兩個(gè)數(shù)組中不同數(shù)據(jù)的方法,實(shí)例分析了java操作數(shù)組的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-03-03
  • SpringBoot實(shí)現(xiàn)上傳文件到AWS S3的代碼

    SpringBoot實(shí)現(xiàn)上傳文件到AWS S3的代碼

    這篇文章主要介紹了SpringBoot實(shí)現(xiàn)上傳文件到AWS S3的代碼,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下
    2020-10-10
  • JavaSE一維數(shù)組和二維數(shù)組用法詳解

    JavaSE一維數(shù)組和二維數(shù)組用法詳解

    數(shù)組存儲(chǔ)同一種數(shù)據(jù)類型多個(gè)元素的集合,既可以存儲(chǔ)基本數(shù)據(jù)類型,也可以存儲(chǔ)引用數(shù)據(jù)類型,這篇文章主要給大家介紹了關(guān)于JavaSE一維數(shù)組和二維數(shù)組用法的相關(guān)資料,需要的朋友可以參考下
    2024-04-04

最新評(píng)論

怀安县| 无锡市| 平泉县| 米易县| 金寨县| 咸丰县| 七台河市| 墨脱县| 宁陵县| 故城县| 汕头市| 山西省| 唐山市| 武城县| 临猗县| 鲁山县| 遵义县| 苗栗市| 武邑县| 台北市| 大洼县| 奉节县| 若尔盖县| 栖霞市| 苍南县| 鄄城县| 内黄县| 秦皇岛市| 循化| 搜索| 隆德县| 海兴县| 禹城市| 汉阴县| 汉沽区| 东兴市| 通许县| 乌海市| 城固县| 辉县市| 崇阳县|