" />

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

JAVA設計模式中的策略模式你了解嗎

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

策略模式

世界上本沒有模式;

一些程序老鳥在長時間的編程工作總結出高效的代碼寫法被后世推崇;

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

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

策略模式是什么

在策略模式(Strategy Pattern)中,一個類的行為或其算法可以在運行時更改。這種類型的設計模式屬于行為型模式。

策略模式的使用場景

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

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

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

Q: 那我就有個疑問了,我就喜歡寫if - else switch,我為什么要用策略模式呢,難道就是為了看起來牛逼嗎?

A: 首先并不是所有的if - else switch 都適合使用策略模式改造,策略模式可謂是把雙刃劍,使用時也會帶來一些問題,比如說實現類膨脹;

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

A: 策略模式對標的是代碼中的if - else操作,主要針對if - else 的嵌套層級和每個if - else下的代碼處理行數;

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

策略模式實踐

我們使用一個簡單的計算器需求來模擬策略模式的使用場景

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

    /**
     * 計算數字
     *
     * @param num1     參數1
     * @param num2     參數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("無效的操作算法");
    }
}

以上代碼使用if-else代碼實現了一個簡單的計算器代碼,實現也完全沒大問題,但是也存在弊端

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

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

下面使用策略模式對這個代碼進行優(yōu)化

/**
 * 使用策略模式進行優(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);
    }

    /**
     * 計算數字
     *
     * @param num1     參數1
     * @param num2     參數2
     * @param operator 操作算法
     * @return
     */
    public Integer calculate(Integer num1, Integer num2, String operator) {
        CalculatorOperator calculatorOperator = calculatorOperatorMap.get(operator);
        if(calculatorOperator == null){
            throw new RuntimeException("無效的操作算法:" + 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;
        }
    }

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

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

    /**
     * 加法實現
     */
    public class CalculatorOperatorAddImpl implements CalculatorOperator{

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

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

    /**
     * 減法實現
     */
    public class CalculatorOperatorSubImpl implements CalculatorOperator{

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

        /**
         * 加法操作
         * @param num1 參數1
         * @param num2 參數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,"*"));
    }
}

策略模式以后類比較多,畫個簡單的圖方便理解

在這里插入圖片描述

其實這里結合工廠模式更好用,使用Map calculatorOperatorMap其實也一個意思;

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

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

1.擴展性提升;

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

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!   

相關文章

  • Java實現ArrayList排序的方法詳解

    Java實現ArrayList排序的方法詳解

    Java中常見的ArrayList排序方法主要為三種:JDK8的stream、Comparator#compare()和Comparable#compareTo(),本文將詳解這三者的使用,需要的可以參考一下
    2022-05-05
  • Springboot2.X集成redis集群(Lettuce)連接的方法

    Springboot2.X集成redis集群(Lettuce)連接的方法

    這篇文章主要介紹了Springboot2.X集成redis集群(Lettuce)連接的方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • HttpServletRequest對象簡介_動力節(jié)點Java學院整理

    HttpServletRequest對象簡介_動力節(jié)點Java學院整理

    這篇文章主要為大家詳細介紹了HttpServletRequest對象簡介的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Java實現短信驗證碼服務的完整代碼示例

    Java實現短信驗證碼服務的完整代碼示例

    這篇文章主要介紹了Java實現短信驗證碼服務的完整代碼示例,文中使用阿里云的短信服務進行應用開發(fā)的流程,包括將屬性寫入application.yml配置文件,定義類并指定配置文件,注入實體類對象等等,需要的朋友可以參考下
    2024-09-09
  • Spring的UnsatisfiedDependencyException異常的解決

    Spring的UnsatisfiedDependencyException異常的解決

    在使用Spring框架開發(fā)應用程序時,我們經常會遇到各種異常,本文主要介紹了Spring的UnsatisfiedDependencyException異常的解決,感興趣的可以了解一下
    2023-11-11
  • 熟悉maven:使java開發(fā)變得更高效

    熟悉maven:使java開發(fā)變得更高效

    在日常的開發(fā)過程中,maven是很常見的項目構建工具。maven可以極大的提高我們的開發(fā)效率,幫助我們簡化開發(fā)過程中一些解決依賴和項目部署的相關問題,所以學習掌握maven的相關知識是非常有必要的
    2021-06-06
  • SpringBoot+Vue+Axios+BootStrap實現圖書的增刪改查功能示例

    SpringBoot+Vue+Axios+BootStrap實現圖書的增刪改查功能示例

    本文主要介紹了SpringBoot+Vue+Axios+BootStrap實現圖書的增刪改查功能,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Java?限制前端重復請求的實例代碼

    Java?限制前端重復請求的實例代碼

    這篇文章主要介紹了Java?限制前端重復請求,文中給大家提到了JAVA利用自定義本地鎖解決重復提交的問題,通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • Spring boot調用Oracle存儲過程的兩種方式及完整代碼

    Spring boot調用Oracle存儲過程的兩種方式及完整代碼

    這篇文章主要給大家介紹了關于Spring boot調用Oracle存儲過程的兩種方式及完整代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2020-08-08
  • SpringCloud的Config配置中心詳解

    SpringCloud的Config配置中心詳解

    這篇文章主要介紹了SpringCloud的Config配置中心詳解,SpringCloud Config為微服務架構中的微服務提供集中化的外部配置支持,配置服務器為各個不同微服務應用的所有環(huán)境提供了一個中心化的外部配置,需要的朋友可以參考下
    2023-07-07

最新評論

汤原县| 堆龙德庆县| 台江县| 基隆市| 武冈市| 桐乡市| 进贤县| 三河市| 天津市| 永年县| 岑巩县| 当阳市| 宾阳县| 醴陵市| 桃园县| 靖安县| 改则县| 休宁县| 富蕴县| 伊金霍洛旗| 介休市| 江山市| 子长县| 翁牛特旗| 广西| 呼伦贝尔市| 疏勒县| 苏尼特右旗| 临邑县| 渭南市| 洛南县| 宜兰市| 股票| 醴陵市| 周至县| 攀枝花市| 山东| 丰宁| 万州区| 方山县| 安康市|