Java如何利用策略模式替代if/else語句
平時在開發(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來反射獲取對象的實例,這里使用枚舉來維護二者的對應(yīng)關(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和對應(yīng)處理類的映射關(guān)系。至此策略模式優(yōu)化就已經(jīng)完成了,運行MainStart可以看到運行結(jié)果。
以上就是Java如何利用策略模式替代if/else語句的詳細內(nèi)容,更多關(guān)于Java 策略模式的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java POI讀取excel中數(shù)值精度損失問題解決
這篇文章主要介紹了Java POI讀取excel中數(shù)值精度損失問題解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-04-04
如何解決IDEA中JSP頁面部分出現(xiàn)綠色背景色問題
這篇文章主要介紹了如何解決IDEA中JSP頁面部分出現(xiàn)綠色背景色問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12
java生成excel并導(dǎo)出到對應(yīng)位置的方式
這篇文章主要介紹了java生成excel并導(dǎo)出到對應(yīng)位置的方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01

