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

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

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

1.基本介紹

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

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

例如:針對(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ù)寫esPolicyHandler方法

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

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

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

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

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

5)測試

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é)能策略處理===

問題:傳統(tǒng)方法是通過子類繼承父類并復(fù)寫父類方法來實(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)測試

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ò)展開放”原則,客戶端增加行為而不用修改原有的代碼,只要添加一種策略(或者行為)即可,避免了使用多重轉(zhuǎn)移語句(if…else if…else)

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

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

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

相關(guān)文章

  • SpringBoot+WebMagic實(shí)現(xiàn)網(wǎng)頁爬蟲的示例代碼

    SpringBoot+WebMagic實(shí)現(xiàn)網(wǎng)頁爬蟲的示例代碼

    本文是對(duì)spring?boot+WebMagic+MyBatis做了整合,使用WebMagic爬取數(shù)據(jù),然后通過MyBatis持久化爬取的數(shù)據(jù)到mysql數(shù)據(jù)庫,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • Springboot 2.x集成kafka 2.2.0的示例代碼

    Springboot 2.x集成kafka 2.2.0的示例代碼

    kafka近幾年更新非??欤部梢钥闯鰇afka在企業(yè)中是用的頻率越來越高。本文主要為大家介紹了Springboot 2.x集成kafka 2.2.0的示例代碼,需要的可以參考一下
    2022-04-04
  • Springmvc處理ajax請(qǐng)求并返回json數(shù)據(jù)

    Springmvc處理ajax請(qǐng)求并返回json數(shù)據(jù)

    這篇文章主要介紹了Springmvc處理ajax請(qǐng)求并返回json數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Java實(shí)現(xiàn)的猜數(shù)字游戲示例

    Java實(shí)現(xiàn)的猜數(shù)字游戲示例

    這篇文章主要介紹了Java實(shí)現(xiàn)的猜數(shù)字游戲,涉及Java數(shù)學(xué)運(yùn)算與判斷相關(guān)操作技巧,需要的朋友可以參考下
    2018-06-06
  • Java分布式鎖理論(redis、zookeeper))案例詳解

    Java分布式鎖理論(redis、zookeeper))案例詳解

    zookeeper有個(gè)節(jié)點(diǎn)路徑的概念,節(jié)點(diǎn)路徑不能重復(fù),保證了唯一性,這篇文章給大家介紹Java分布式鎖理論(redis、zookeeper)?案例詳解,感興趣的朋友跟隨小編一起看看吧
    2024-01-01
  • Java利用EasyExcel解析動(dòng)態(tài)表頭及導(dǎo)出實(shí)現(xiàn)過程

    Java利用EasyExcel解析動(dòng)態(tài)表頭及導(dǎo)出實(shí)現(xiàn)過程

    以前做導(dǎo)出功能,表頭和數(shù)據(jù)都是固定的,下面這篇文章主要給大家介紹了關(guān)于Java利用EasyExcel解析動(dòng)態(tài)表頭及導(dǎo)出實(shí)現(xiàn)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • java 排序算法之選擇排序

    java 排序算法之選擇排序

    本文主要講解了java 排序算法之選擇排序,選擇排序是最簡單直觀的一種算法,想要了解相關(guān)知識(shí)的朋友快來看一看這篇文章吧
    2021-09-09
  • 使用jackson實(shí)現(xiàn)對(duì)象json之間的相互轉(zhuǎn)換(spring boot)

    使用jackson實(shí)現(xiàn)對(duì)象json之間的相互轉(zhuǎn)換(spring boot)

    這篇文章主要介紹了使用jackson實(shí)現(xiàn)對(duì)象json之間的相互轉(zhuǎn)換(spring boot),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 最全總結(jié)SpringBean的作用域管理

    最全總結(jié)SpringBean的作用域管理

    今天給大家詳細(xì)總結(jié)了SpringBean的作用域管理,文中有非常詳細(xì)的圖文介紹以及代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們還很有幫助,需要的朋友可以參考下
    2021-05-05
  • 針對(duì)Dubbo接口Mock的解決方案詳解

    針對(duì)Dubbo接口Mock的解決方案詳解

    這篇文章主要為大家介紹了針對(duì)Dubbo接口Mock的解決方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09

最新評(píng)論