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

Map map = new HashMap();

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语句的详细内容,更多关于Java 策略模式的资料请关注云海天教程其它相关文章!

原文链接:https://www.cnblogs.com/lm970585581/p/11065787.html

java策略模式 if else_Java如何利用策略模式替代if/else语句相关推荐

  1. Java实现回形数,只利用数组、循环和if-else语句

    import java.util.Scanner; public class learn { public static void main(String[] args){ System.out.pr ...

  2. Android开发模式:模型—视图—主导器模式

    我们有可能使用过MVC(Model-View-Controller)模式,但当我们用更优的方法测试Android代码时,使用MVP(模型-视图-主导器:Model-View-Presenter)模式可 ...

  3. java 策略模式会员_七:策略模式(不同等级会员打折算法)

    定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化: 下面给出策略模式的类图,引自百度百科. 策略模式在LZ第一次接触到的时 ...

  4. Java 8中使用Lambda表达式的策略模式

    策略模式是" 设计模式:可重用对象的元素"书中的模式之一 . 本书所述的策略模式的意图是: 定义一系列算法,封装每个算法,并使它们可互换. 策略使算法独立于使用该算法的客户端而变化 ...

  5. python多个if怎么优化_利用策略模式优化过多 if else 代码

    前言 利用利用策略模式实际开发中 if else 条件判断过多的问题 比如平时大家是否都会写类似这样的代码: if(a) {//dosomething }else if(b) {//doshometh ...

  6. 图解Java设计模式学习笔记——行为型模式(模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式)

    一.模板方法模式(模板模式)--钩子方法 1.需求-豆浆制作问题 编写制作豆浆的程序,说明如下: 制作豆浆的流程选材-->添加配料-->浸泡-->放到豆浆机打碎. 通过添加不同的配料 ...

  7. java商场满减活动_Java使用策略模式解决商场促销商品问题示例

    本文实例讲述了Java使用策略模式解决商场促销商品问题.分享给大家供大家参考,具体如下: 一 模式定义 策略模式:定义一系列的算法,将每一种算法封装起来并可以相互替换使用,策略模式让算法独立于使用它的 ...

  8. 【Java设计模式】Java设计模式之(十五)策略模式(Strategy Pattern)

    本文目录 一.策略模式介绍 1.1 含义 1.2 适用场景 1.3 主要解决 1.4 应用实例 1.5 优缺点 二.策略模式实现 2.1 类图 2.2 代码实现 第一个案例:策略模式代码实现 第二个案 ...

  9. java策略设计模式输出字母_Java 设计模式-策略模式(Strategy Pattern)

    策略模式(Strategy Pattern)属于对象行为模式.其作用是针对一组算法,将每个算法封装到具有共同接口的独立类中,从而使它们可以相互替换. 策略模式的意图是将可以互换的方法封装在各自的对立类 ...

最新文章

  1. arm服务器获取文件路径中文,ssh 访问远程服务器文件路径
  2. 第一次经历黑客攻击服务器系统
  3. 【设计模式】装饰者模式
  4. UA OPTI501 电磁波 求解Maxwell方程组的波动方程方法
  5. 【分析】大数据爆破之年:在这5个领域“掘金”最靠谱
  6. android 设置 媒体服务器,第三讲:如何掌握媒体服务器的运行情况
  7. HALCON示例程序max_connection.hdev确定分割区域的最大区域数目
  8. key redis 遍历_快乐运维Redis大数据量查询与清理
  9. UI设计师收好!哪些会说故事的插画素材!
  10. 这些Python骚操作,你知道吗?
  11. ecdf与ksdensity的区别
  12. OpenCV-Python<八> 图像平滑处理
  13. 从学生到职场,这位百万爬虫博主都经历了什么?
  14. 可行性分析与需求分析
  15. APP推广|小众APP推广渠道,总有适合你的。
  16. zookeeper Session Expired
  17. 大数据破获网售假耐克案
  18. php - 解决百万级全站用户消息推送问题
  19. 主机服务器安全策略(一):账户口令安全
  20. 网易工程师亲历:一次sql缺少where条件的惨案…

热门文章

  1. 不疯狂的外星人,已疯狂的资本
  2. 订单生产计划表范本_生产计划管理与物料控制的实施步骤与要领
  3. CTF -杂项密码学,常见密码介绍(三)
  4. 【Python教程】类及对象教程
  5. Python基础教程:strip 函数踩坑
  6. python基础语法教程:行与缩进
  7. 四步解读python生成器
  8. python实现顺序查找和哈希查找
  9. Python使用数字与字符串的技巧
  10. python使用threading模块实现多线程