热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

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

这篇文章主要介绍了Java如何利用策略模式替代ifelse语句,帮助大家优化自己的代码,提高程序运行效率,感兴趣的朋友可以了解下

平时在开发中避免不了使用大量的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 策略模式的资料请关注其它相关文章!


推荐阅读
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文介绍了如何使用 PostgreSQL 的 `UPDATE ... FROM` 语法,通过映射表实现对多行记录进行高效的批量更新。这种方法不仅适用于单列更新,还支持多列的同时更新。 ... [详细]
  • 本文详细介绍了如何使用libpq库与PostgreSQL后端建立连接。通过探讨PQconnectdb()函数的工作原理及其在实际应用中的使用方法,帮助读者理解并掌握建立高效、稳定的数据库连接的关键步骤。 ... [详细]
  • Windows服务与数据库交互问题解析
    本文探讨了在Windows 10(64位)环境下开发的Windows服务,旨在定期向本地MS SQL Server (v.11)插入记录。尽管服务已成功安装并运行,但记录并未正确插入。我们将详细分析可能的原因及解决方案。 ... [详细]
  • SQL中UPDATE SET FROM语句的使用方法及应用场景
    本文详细介绍了SQL中UPDATE SET FROM语句的使用方法,通过具体示例展示了如何利用该语句高效地更新多表关联数据。适合数据库管理员和开发人员参考。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 计算机网络复习:第五章 网络层控制平面
    本文探讨了网络层的控制平面,包括转发和路由选择的基本原理。转发在数据平面上实现,通过配置路由器中的转发表完成;而路由选择则在控制平面上进行,涉及路由器中路由表的配置与更新。此外,文章还介绍了ICMP协议、两种控制平面的实现方法、路由选择算法及其分类等内容。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 构建基于BERT的中文NL2SQL模型:一个简明的基准
    本文探讨了将自然语言转换为SQL语句(NL2SQL)的任务,这是人工智能领域中一项非常实用的研究方向。文章介绍了笔者在公司举办的首届中文NL2SQL挑战赛中的实践,该比赛提供了金融和通用领域的表格数据,并标注了对应的自然语言与SQL语句对,旨在训练准确的NL2SQL模型。 ... [详细]
  • 本文详细介绍了HTML中标签的使用方法和作用。通过具体示例,解释了如何利用标签为网页中的缩写和简称提供完整解释,并探讨了其在提高可读性和搜索引擎优化方面的优势。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 使用C#开发SQL Server存储过程的指南
    本文介绍如何利用C#在SQL Server中创建存储过程,涵盖背景、步骤和应用场景,旨在帮助开发者更好地理解和应用这一技术。 ... [详细]
  • 本文探讨了适用于Spring Boot应用程序的Web版SQL管理工具,这些工具不仅支持H2数据库,还能够处理MySQL和Oracle等主流数据库的表结构修改。 ... [详细]
author-avatar
Owi妓l_972
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有