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

Java如何利用策略模式替代if/else語句

 更新時間:2020年09月28日 09:38:22   作者:H.U.C-王子  
這篇文章主要介紹了Java如何利用策略模式替代if/else語句,幫助大家優(yōu)化自己的代碼,提高程序運行效率,感興趣的朋友可以了解下

平時在開發(fā)中避免不了使用大量的if else語句,但過多層的if else對于性能有很大的開銷,類似如下代碼

public class MainStart {

  public static void main(String[] args) {
    String msgid = "MS066";
    if(message.equals("MS066")){
      System.out.println("MS066");
    }else if (message.equals("MS034")){
      System.out.println("MS034");
    }else if (message.equals("MS064")){
      System.out.println("MS064");
    }else{
      System.out.println("no msgid!");
    }
  }
}

上邊代碼只是示例,實際情況可能不止4層

策略模式是一種解耦的方法,它對算法進行封裝,使得算法的調(diào)用和算法本身分離。使用策略模式客戶端代碼不需要調(diào)整,算法之間可以互相替換,因為不同的算法實現(xiàn)的是同一個接口。將上面的代碼優(yōu)化后變?yōu)椋?/p>

public class MainStart {

  public static void main(String[] args) {     OrderDictController controller=new OrderDictController();
    String msgid = "MS066";
    MsgInterface msgInterface=MsgContext.getInstance(msgId);     msgInterface.manage(msg,controller);
  }
}

實現(xiàn)策略模式需要以下幾個步驟:

1.定義接口

import java.sql.SQLException;

import org.dom4j.DocumentException;

import com.huc.controller.OrderDictController;

public interface MsgInterface {
  public void manage(String msg, OrderDictController controller) throws DocumentException, SQLException;
}

2.實現(xiàn)接口,重寫處理邏輯

package com.huc.msg.imp;

import java.sql.SQLException;

import org.dom4j.DocumentException;

import com.huc.controller.OrderDictController;
import com.huc.msg.MsgInterface;

public class MS003 implements MsgInterface{
  @Override
  public void manage(String msg, OrderDictController controller) throws DocumentException, SQLException {
    controller.manageMs003(msg);
  }
}
package com.huc.msg.imp;

import java.sql.SQLException;

import org.dom4j.DocumentException;

import com.huc.controller.OrderDictController;
import com.huc.msg.MsgInterface;

public class MS028 implements MsgInterface{
  @Override
  public void manage(String msg, OrderDictController controller) throws DocumentException, SQLException {
    controller.manageMs028(msg);
  }
}

寫兩個作為例子,可根據(jù)情況自行擴展實現(xiàn)類

3.定義策略上下文,根據(jù)msgid獲取對象實例

package com.huc.msg;

import java.util.Map;

public class MsgContext {
  public static MsgInterface getInstance(String msgId){
    MsgInterface inter=null;
    Map<String, String> allClazz = MsgEnum.getAllClazz();
    String clazz = allClazz.get(msgId);
    if (msgId!=null&&msgId.trim().length()>0) {
      try {
        try {
          inter = (MsgInterface) Class.forName(clazz).newInstance();//調(diào)用無參構(gòu)造器創(chuàng)建實例
        } catch (InstantiationException e) {
          e.printStackTrace();
        } catch (IllegalAccessException e) {
          e.printStackTrace();
        }
      } catch (ClassNotFoundException e) {
        e.printStackTrace();
      }
    }
    return inter;
  }
}

在這一步驟中,我們需要一種方式可以根據(jù)msgid來反射獲取對象的實例,這里使用枚舉來維護二者的對應關(guān)系。

package com.huc.msg;

import java.util.HashMap;
import java.util.Map;

public enum MsgEnum {

  MS066("MS066", "com.huc.msg.imp.MS066"),
  MS034("MS034", "com.huc.msg.imp.MS034"),
  MS064("MS064", "com.huc.msg.imp.MS064"),
  MS028("MS028", "com.huc.msg.imp.MS028"),
  MS003("MS003", "com.huc.msg.imp.MS003"),
  MS062("MS062", "com.huc.msg.imp.MS062"),
  MS154("MS154", "com.huc.msg.imp.MS154"),
  MS153("MS153", "com.huc.msg.imp.MS153"),
  MS033("MS033", "com.huc.msg.imp.MS033");
  private String msgid;
  private String clazz;

  public static Map<String, String> getAllClazz() {
    Map<String, String> map = new HashMap<String, String>();
    for (MsgEnum msgEnum : MsgEnum.values()) {
      map.put(msgEnum.getMsgid(), msgEnum.getClazz());
    }
    return map;
  }


  MsgEnum(String msgid, String clazz) {
    this.msgid = msgid;
    this.clazz = clazz;
  }


  public String getMsgid() {
    return msgid;
  }


  public void setMsgid(String msgid) {
    this.msgid = msgid;
  }


  public String getClazz() {
    return clazz;
  }

  public void setClazz(String clazz) {
    this.clazz = clazz;
  }

}

在上面的代碼中,getAllClazz()方法用于獲取所有message和對應處理類的映射關(guān)系。至此策略模式優(yōu)化就已經(jīng)完成了,運行MainStart可以看到運行結(jié)果。

以上就是Java如何利用策略模式替代if/else語句的詳細內(nèi)容,更多關(guān)于Java 策略模式的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringMVC Hibernate與JPA使用教程

    SpringMVC Hibernate與JPA使用教程

    這篇文章主要介紹了SpringMVC Hibernate與JPA,在正式進入Hibernate的高級應用之前,需要了解聲明是數(shù)據(jù)模型與領(lǐng)域模型,這兩個概念將會幫助我們更好的理解實體對象的關(guān)聯(lián)關(guān)系映射
    2022-12-12
  • Springboot深入講解nocos的整合與使用

    Springboot深入講解nocos的整合與使用

    Nacos?是阿里巴巴推出來的一個新開源項目,這是一個更易于構(gòu)建云原生應用的動態(tài)服務發(fā)現(xiàn)、配置管理和服務管理平臺,在項目開發(fā)過程中,我們經(jīng)常使用nacos作為配置中心和注冊中心。本文章我們就從代碼層面研究下springboot是如何整合nacos使用的
    2022-07-07
  • 關(guān)于knife4j的使用及配置

    關(guān)于knife4j的使用及配置

    這篇文章主要介紹了關(guān)于knife4j的使用及配置,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • MyBatis-Plus如何關(guān)閉SQL日志打印詳解

    MyBatis-Plus如何關(guān)閉SQL日志打印詳解

    在使用mybatisplus進行開發(fā)時,日志是一個非常有用的工具,它可以幫助我們更好地了解和調(diào)試我們的代碼,這篇文章主要給大家介紹了關(guān)于MyBatis-Plus如何關(guān)閉SQL日志打印的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • Mybatis調(diào)用MySQL存儲過程的簡單實現(xiàn)

    Mybatis調(diào)用MySQL存儲過程的簡單實現(xiàn)

    本篇文章主要介紹了Mybatis調(diào)用MySQL存儲過程的簡單實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-04-04
  • 基于java socket實現(xiàn) 聊天小程序

    基于java socket實現(xiàn) 聊天小程序

    這篇文章主要介紹了基于java socket實現(xiàn) 聊天小程序,代碼分為服務器和客戶端,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12
  • Java開發(fā)者必備10大數(shù)據(jù)工具和框架

    Java開發(fā)者必備10大數(shù)據(jù)工具和框架

    這篇文章主要為大家詳細介紹了Java開發(fā)者必備10大數(shù)據(jù)工具和框架,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • IDEA中添加xml配置文件時,顯示file問題

    IDEA中添加xml配置文件時,顯示file問題

    這篇文章主要介紹了IDEA中添加xml配置文件時,顯示file問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 關(guān)于HttpServletRequest獲取POST請求Body參數(shù)的3種方式

    關(guān)于HttpServletRequest獲取POST請求Body參數(shù)的3種方式

    這篇文章主要介紹了關(guān)于HttpServletRequest獲取POST請求Body參數(shù)的3種方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • springboot驗證碼的生成與驗證的兩種方法

    springboot驗證碼的生成與驗證的兩種方法

    本文主要介紹了springboot驗證碼的生成與驗證的兩種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06

最新評論

大化| 昭平县| 崇礼县| 漳平市| 枝江市| 卫辉市| 菏泽市| 宁远县| 太和县| 分宜县| 通道| 辰溪县| 邹城市| 沁阳市| 江阴市| 屏东县| 建阳市| 山东省| 玉龙| 上高县| 大名县| 佛学| 华阴市| 治多县| 元氏县| 响水县| 昆明市| 宁夏| 阜康市| 清原| 库尔勒市| 清流县| 惠来县| 永吉县| 喀什市| 依安县| 乐陵市| 曲沃县| 利津县| 章丘市| 高要市|