" />

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

JAVA設(shè)計(jì)模式中的策略模式你了解嗎

 更新時(shí)間:2022年03月27日 16:12:23   作者:Asparrow  
這篇文章主要為大家詳細(xì)介紹了JAVA設(shè)計(jì)模式中的策略模式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助

策略模式

世界上本沒(méi)有模式;

一些程序老鳥(niǎo)在長(zhǎng)時(shí)間的編程工作總結(jié)出高效的代碼寫(xiě)法被后世推崇;

并整理出固定的寫(xiě)法規(guī)范,這個(gè)寫(xiě)法規(guī)范目前收錄有23種

這些規(guī)范被稱之為 --> 設(shè)計(jì)模式

策略模式是什么

在策略模式(Strategy Pattern)中,一個(gè)類的行為或其算法可以在運(yùn)行時(shí)更改。這種類型的設(shè)計(jì)模式屬于行為型模式。

策略模式的使用場(chǎng)景

Q: 我們知道策略模式最重要的就是封裝變化點(diǎn),那邊對(duì)于變化點(diǎn)我們一般用什么處理呢?

A: 是的 我們一般用if - else 處理需要對(duì)變化點(diǎn)做出不同的反應(yīng),策略模式就可以替換代碼中的if - else操作

其實(shí)策略模式主要就是替換代碼中的if - else操作,當(dāng)然也可以是switch

Q: 那我就有個(gè)疑問(wèn)了,我就喜歡寫(xiě)if - else switch,我為什么要用策略模式呢,難道就是為了看起來(lái)牛逼嗎?

A: 首先并不是所有的if - else switch 都適合使用策略模式改造,策略模式可謂是把雙刃劍,使用時(shí)也會(huì)帶來(lái)一些問(wèn)題,比如說(shuō)實(shí)現(xiàn)類膨脹;

Q: 既然是把雙刃劍,那么如何判斷是否應(yīng)該使用策略模式呢?

A: 策略模式對(duì)標(biāo)的是代碼中的if - else操作,主要針對(duì)if - else 的嵌套層級(jí)和每個(gè)if - else下的代碼處理行數(shù);

(你的if - else 判斷多余兩次) && (每個(gè)if - else 下的處理代碼超過(guò)5行) -> 建議使用策略模式優(yōu)化代碼

策略模式實(shí)踐

我們使用一個(gè)簡(jiǎn)單的計(jì)算器需求來(lái)模擬策略模式的使用場(chǎng)景

/**
 * 計(jì)算器
 *
 * @author cans
 * @date 2022/3/26
 **/
public class Calculator {

    /**
     * 計(jì)算數(shù)字
     *
     * @param num1     參數(shù)1
     * @param num2     參數(shù)2
     * @param operator 操作算法
     * @return
     */
    public Integer calculate(Integer num1, Integer num2, String operator) {

        if(operator.equals("+")){
            return num1 + num2;
        }else if(operator.equals("-")){
            return num1 - num2;
        }
        throw new RuntimeException("無(wú)效的操作算法");
    }
}

以上代碼使用if-else代碼實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的計(jì)算器代碼,實(shí)現(xiàn)也完全沒(méi)大問(wèn)題,但是也存在弊端

1.擴(kuò)展性不好,比如擴(kuò)展乘法需要在代碼中追加if-else

2.一兩個(gè)if-else還好如果操作算法多了以后影響代碼的可讀性

下面使用策略模式對(duì)這個(gè)代碼進(jìn)行優(yōu)化

/**
 * 使用策略模式進(jìn)行優(yōu)化
 *
 * @author cans
 * @date 2022/3/26
 **/
public class Calculator2 {

    private  Map<String,CalculatorOperator> calculatorOperatorMap = new HashMap<>();

    public Calculator2(){
        CalculatorOperatorAddImpl calculatorOperatorAdd = new CalculatorOperatorAddImpl();
        CalculatorOperatorSubImpl calculatorOperatorSub = new CalculatorOperatorSubImpl();
        calculatorOperatorMap.put(calculatorOperatorAdd.getOperator(),calculatorOperatorAdd);
        calculatorOperatorMap.put(calculatorOperatorSub.getOperator(),calculatorOperatorSub);
    }

    /**
     * 計(jì)算數(shù)字
     *
     * @param num1     參數(shù)1
     * @param num2     參數(shù)2
     * @param operator 操作算法
     * @return
     */
    public Integer calculate(Integer num1, Integer num2, String operator) {
        CalculatorOperator calculatorOperator = calculatorOperatorMap.get(operator);
        if(calculatorOperator == null){
            throw new RuntimeException("無(wú)效的操作算法:" + operator);
        }
        return calculatorOperator.calculate(num1, num2);
    }

    /**
     * 支持的算法枚舉
     */
    public enum Operator{
        ADD("+"),SUB("-");

        private String operator;

        Operator(String operator){
            this.operator = operator;
        }

        public String getOperator() {
            return operator;
        }

        public void setOperator(String operator) {
            this.operator = operator;
        }
    }

    /**
     * 計(jì)算頂層接口
     */
    public interface CalculatorOperator{
        /**
         * 算法操作
         * @return
         */
        public String getOperator();

        /**
         * 計(jì)算方法
         *
         * @param num1 參數(shù)1
         * @param num2 參數(shù)2
         * @return
         */
        public Integer calculate(Integer num1, Integer num2);
    }

    /**
     * 加法實(shí)現(xiàn)
     */
    public class CalculatorOperatorAddImpl implements CalculatorOperator{

        @Override
        public String getOperator() {
            return Operator.ADD.getOperator();
        }

        /**
         * 加法操作
         * @param num1 參數(shù)1
         * @param num2 參數(shù)2
         * @return
         */
        public Integer calculate(Integer num1, Integer num2) {
         return num1 + num2;
        }
    }

    /**
     * 減法實(shí)現(xiàn)
     */
    public class CalculatorOperatorSubImpl implements CalculatorOperator{

        @Override
        public String getOperator() {
            return Operator.SUB.getOperator();
        }

        /**
         * 加法操作
         * @param num1 參數(shù)1
         * @param num2 參數(shù)2
         * @return
         */
        public Integer calculate(Integer num1, Integer num2) {
            return num1 - num2;
        }
    }

    @Test
    public void testCalculate(){
        System.out.println("1+1 = : " + calculate(1,1,"+"));
        System.out.println("1-1 = : " + calculate(1,1,"-"));
        System.out.println("1*1 = : " + calculate(1,1,"*"));
    }
}

策略模式以后類比較多,畫(huà)個(gè)簡(jiǎn)單的圖方便理解

在這里插入圖片描述

其實(shí)這里結(jié)合工廠模式更好用,使用Map calculatorOperatorMap其實(shí)也一個(gè)意思;

可以看到使用策略模式以后類膨脹非常厲害,從之前1個(gè)類膨脹到4個(gè)類,但是擴(kuò)展性得到了大大的提升,后續(xù)的算法擴(kuò)展只需要在枚舉中新增枚舉類,實(shí)現(xiàn)響應(yīng)的算法實(shí)現(xiàn)即可;

綜上示例策略模式優(yōu)勢(shì)如下幾點(diǎn):

1.擴(kuò)展性提升;

2.主體業(yè)務(wù)邏輯更清晰;

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!   

相關(guān)文章

  • Swagger及knife4j的基本使用詳解

    Swagger及knife4j的基本使用詳解

    Swagger是一個(gè)規(guī)范和完整的框架,用于生成、描述、調(diào)用和可視化RESTful風(fēng)格的?Web?服務(wù),這篇文章主要介紹了Swagger以及knife4j的基本使用,需要的朋友可以參考下
    2022-08-08
  • Java使用CountDownLatch實(shí)現(xiàn)網(wǎng)絡(luò)同步請(qǐng)求的示例代碼

    Java使用CountDownLatch實(shí)現(xiàn)網(wǎng)絡(luò)同步請(qǐng)求的示例代碼

    CountDownLatch 是一個(gè)同步工具類,用來(lái)協(xié)調(diào)多個(gè)線程之間的同步,它能夠使一個(gè)線程在等待另外一些線程完成各自工作之后,再繼續(xù)執(zhí)行。被將利用CountDownLatch實(shí)現(xiàn)網(wǎng)絡(luò)同步請(qǐng)求,異步同時(shí)獲取商品信息組裝,感興趣的可以了解一下
    2023-01-01
  • Java字符串編碼知識(shí)點(diǎn)詳解介紹

    Java字符串編碼知識(shí)點(diǎn)詳解介紹

    在本篇內(nèi)容了小編給大家詳細(xì)分析了關(guān)于Java字符串編碼的知識(shí)點(diǎn)并對(duì)實(shí)例做了分析,有興趣的朋友們跟著學(xué)習(xí)下。
    2022-11-11
  • Springboot集成Kafka實(shí)現(xiàn)producer和consumer的示例代碼

    Springboot集成Kafka實(shí)現(xiàn)producer和consumer的示例代碼

    這篇文章主要介紹了Springboot集成Kafka實(shí)現(xiàn)producer和consumer的示例代碼,詳細(xì)的介紹了什么是Kafka和安裝Kafka以及在springboot項(xiàng)目中集成kafka收發(fā)message,感興趣的小伙伴們可以參考一下
    2018-05-05
  • 詳解Java編程中static關(guān)鍵字和final關(guān)鍵字的使用

    詳解Java編程中static關(guān)鍵字和final關(guān)鍵字的使用

    這篇文章主要介紹了詳解Java編程中static關(guān)鍵字和final關(guān)鍵字的使用,是Java入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • springboot的pom.xml配置方式

    springboot的pom.xml配置方式

    這篇文章主要介紹了springboot的pom.xml配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Object類wait及notify方法原理實(shí)例解析

    Object類wait及notify方法原理實(shí)例解析

    這篇文章主要介紹了Object類wait及notify方法原理實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • RestTemplate發(fā)送請(qǐng)求時(shí)Cookie的影響及注意事項(xiàng)說(shuō)明

    RestTemplate發(fā)送請(qǐng)求時(shí)Cookie的影響及注意事項(xiàng)說(shuō)明

    這篇文章主要介紹了RestTemplate發(fā)送請(qǐng)求時(shí)Cookie的影響及注意事項(xiàng)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。
    2023-07-07
  • 一文帶你搞懂什么是BIO

    一文帶你搞懂什么是BIO

    BIO英文全名是 blocking IO,也叫做 阻塞IO,是最容易理解、最容易實(shí)現(xiàn)的IO工作方式,本文就來(lái)通過(guò)一些簡(jiǎn)單的示例為大家講講什么是BIO吧
    2023-06-06
  • SpringCloud輪詢拉取注冊(cè)表與服務(wù)發(fā)現(xiàn)流程詳解

    SpringCloud輪詢拉取注冊(cè)表與服務(wù)發(fā)現(xiàn)流程詳解

    這篇文章主要介紹了SpringCloud輪詢拉取注冊(cè)表與服務(wù)發(fā)現(xiàn),現(xiàn)在很多創(chuàng)業(yè)公司都開(kāi)始往springcloud靠了,可能是由于文檔和組件比較豐富的原因吧,畢竟是一款目前來(lái)說(shuō)比較完善的微服務(wù)架構(gòu)
    2022-11-11

最新評(píng)論