平时在开发中避免不了使用大量的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. centos6.8(虚拟机VNC)输入正确用户名和密码仍跳回登录界面

    1)CentOS自动更新到6.8后root无法登陆问题解决 虚拟机CentOS服务器不知道被谁更新系统到6.8后,发现在本机上即使输入正确的密码也无法登陆,发现有一些人也碰见过同样的问题,但是他们是因 ...

  2. appium+python+Windows自动化测试文档

    appium+python自动化测试文档 一.认识appium 1.    什么是appium appium是开源的移动端自动化测试框架: appium可以测试原生的.混合的.以及移动端的web项目: ...

  3. 纹理特征描述之自相关函数法 纹理粗糙性与自相关函数的扩展成正比 matlab代码实现

    图像中通常采用自相关函数作为纹理测度 自相关函数的定义为: ​ 调用自定义函数 zxcor()对砖墙面和大理石面纹理进行分析: 自定义函数 zxcor(): function [epsilon,eta ...

  4. Lua易忘点

    仅针对自己 __index的理解 __index是:当我们访问一个表中的元素不存在时,则会触发去寻找__index元方法,如果不存在,则返回nil,如果存在,则返回结果 Window = {} Win ...

  5. zping ping包工具20180605.exe测试版

    链接: https://pan.baidu.com/s/1WB3BZn0r9n4DRU_8bNC65g 提取码: mybi zping的第一个exe版本由于未对兼容性进行测试,使用python3.6编 ...

  6. *【Python】【demo实验31】【练习实例】【使用turtle画小猪佩奇】

    如下图小猪佩奇: 要求使用turtle画小猪佩奇: 源码: # encoding=utf-8 # -*- coding: UTF-8 -*- # 使用turtle画小猪佩奇 from turtle i ...

  7. Android Application的Gradle说明

    //引入插件 apply plugin: 'com.android.application' android { compileSdkVersion 29 buildToolsVersion &quo ...

  8. (五)Java秒杀项目之页面优化

    一.页面缓存+URL缓存+对象缓存 1.通过加缓存来减少对数据库的访问 2.步骤: 取缓存 手动渲染模版 结果输出 3.页面缓存和URL缓存的过期时间比较短,比较适合变化不大的场景,比如商品列表页.而 ...

  9. Elastic Search中DSL Query的常见语法

    Query DSL是一种通过request body提交搜索参数的请求方式.就是将请求头参数(?xxx=xxx)转换为请求体参数.语法格式:GET [/index_name/type_name]/_s ...

  10. Win32汇编过程与宏调用

    汇编语言(assembly language)是一种用于电子计算机.微处理器.微控制器或其他可编程器件的低级语言,亦称为符号语言.在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地 ...