平时在开发中避免不了使用大量的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层

策略模式是一种解耦的方法,它对算法进行封装,使得算法的调用和算法本身分离。使用策略模式客户端代码不需要调整,算法之间可以互相替换,因为不同的算法实现的是同一个接口。将上面的代码优化后变为:

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);
}
}

实现策略模式需要以下几个步骤:

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.实现接口,重写处理逻辑

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);
}
}

写两个作为例子,可根据情况自行扩展实现类

3.定义策略上下文,根据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();//调用无参构造器创建实例
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
return inter;
}
}

在这一步骤中,我们需要一种方式可以根据msgid来反射获取对象的实例,这里使用枚举来维护二者的对应关系。

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和对应处理类的映射关系。至此策略模式优化就已经完成了,运行MainStart可以看到运行结果。

java使用策略模式代替if/else的更多相关文章

  1. java设计模式 策略模式Strategy

    本章讲述java设计模式中,策略模式相关的知识点. 1.策略模式定义 策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户.策略模式属于对象的 ...

  2. JAVA 设计模式 策略模式

    用途 Title 它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. 策略模式是一种行为型模式. 结构

  3. 我的Java设计模式-策略模式

    今天给大家说说田忌赛马的故事.如有雷同,纯属巧合!话说在战国时期,群雄割据,硝烟四起,茶余饭后还是少不了娱乐活动的,其中赛马是最火爆的.一天,孙膑看到田忌像个死鸡似的就知道肯定赛马又输给了齐威王,立马 ...

  4. Java的策略模式

    策略模式也是我们经常使用的模式,它的定义如下:将可变的部分从程序中抽象分离出来成为算法接口,在该部分下分别封装一系列算法实现并使它们可以相互替换. 举个例子,我们现在有三种支付方式:支付宝支付,微信支 ...

  5. Java设计模式—策略模式

    1.策略模式(Strategy Pattern)是一种比较简单的模式,也叫做政策模式(PolicyPattern). 定义如下:     Define a family of algorithms,e ...

  6. Java设计模式-策略模式详解

    前言 在软件领域中,设计模式作为一种经典的开发实践常常需要我们去深入的理解,而策略模式作为设计模式的一种,使用频率也是相对来说比较高的,在Java中,当我们学习TreeSet集合的时候,就采用了经典的 ...

  7. Java 关于策略模式+简单工厂模式下的思考

    导读 最近在做公司一个消息网关的服务,包括:短信.微信.邮件等,所有请求通过一个入口,方便接口的管理(记录日志.接口限流白名单啥的).如何写这个接口呢,还有为了以后扩展,对接过短信.微信.公众号的童鞋 ...

  8. Java 设计模式--策略模式,枚举+工厂方法实现

    如果项目中的一个页面跳转功能存在10个以上的if else判断,想要做一下整改 一.什么是策略模式 策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理,最终可以实现解决 ...

  9. java设计模式--策略模式

    策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化. 本文地址:http:// ...

随机推荐

  1. 用curl指令访问api-server

    可以直接用curl指令访问api-server,一种是将kubeconfig中所包含的证书抠出来作为参数给curl指令使用.这种方法操作起来比较复杂.还要一种很简单的方法: 首先执行 kubectl ...

  2. 视区相关单位vw, vh

    vw:相对于视窗的宽度,视窗宽度是100vw vh:相对于视窗的高度,视窗高度是100vh 参考资料:[https://www.zhangxinxu.com/wordpress/2012/09/new ...

  3. 模型蒸馏(Distil)及mnist实践

    结论:蒸馏是个好方法. 模型压缩/蒸馏在论文<Model Compression>及<Distilling the Knowledge in a Neural Network> ...

  4. 李宏毅 Keras2.0演示

    李宏毅 Keras2.0演示 不得不说李宏毅老师讲课的风格我真的十分喜欢的. 在keras2.0中,李宏毅老师演示的是手写数字识别(这个深度学习框架中的hello world) 创建网络 首先我们需要 ...

  5. PHP学习(2)——操作符与迭代整理

    目录: 10.操作符整理 11.表单计算代码 12.优先级与结合性 13.可变函数 14.条件判断 15.循环迭代 16.跳出控制 17.可替换的控制结构 10.操作符 10.1 算术操作符 算术操作 ...

  6. 论文阅读 | Robust Neural Machine Translation with Doubly Adversarial Inputs

    (1)用对抗性的源实例攻击翻译模型; (2)使用对抗性目标输入来保护翻译模型,提高其对对抗性源输入的鲁棒性. 生成对抗输入:基于梯度 (平均损失)  ->  AdvGen 我们的工作处理由白盒N ...

  7. python库 使用shutil来删除文件夹时报PermissionError时的解决方案

    解决方案: def handle_remove_read_only(func, path, exc): excvalue = exc[1] if func in (os.rmdir, os.remov ...

  8. 【Python】【基础知识】【内置函数】【object的使用方法】

    原英文帮助文档: class object Return a new featureless object. object is a base for all classes. It has the ...

  9. 使用winsw包装服务将nginx包装为Windows服务

    **Nginx本身在Windows上并不支持以服务的形式运行,官方文件中有提到.http://nginx.org/en/docs/windows.html,所以在Windows下使用winsw将Ngi ...

  10. hdu 5651 重复全排列+逆元

    知识点: n个元素,其中a1,a2,····,an互不相同,进行全排列,可得n!个不同的排列. 若其中某一元素ai重复了ni次,全排列出来必有重复元素,其中真正不同的排列数应为 ,即其重复度为ni! ...