900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > java策略模式 if else_java使用策略模式代替if/else

java策略模式 if else_java使用策略模式代替if/else

时间:2018-07-13 23:47:40

相关推荐

java策略模式 if else_java使用策略模式代替if/else

平时在开发中避免不了使用大量的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设计模式 策略模式Strategy

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

JAVA 设计模式 策略模式

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

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

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

Java的策略模式

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

Java设计模式—策略模式

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

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

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

java设计模式--策略模式

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

Java设计模式-策略模式(strategy)

策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户.需要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接口,设计一个抽象类(可有可无 ...

java笔记--策略模式和简单工厂模式

策略模式: --如果朋友您想转载本文章请注明转载地址"/XHJT/p/3884781.html"谢谢-- 为什么使用:策略模式主要用于 ...

随机推荐

C#与数据库访问技术总结(六)之Command对象创建SQl语句代码示例

Command对象创建SQl语句代码示例 说明:前面介绍了 Command 对象的方法和一些属性,回顾一下Command对象主要用来执行SQL语句.利用Command对象,可以查询数据和修改数据. ...

[codevs 1051]接龙游戏(栈)

题目:/problem/1051/ 分析: 当然单词查找树是可以的,但这题有更为简便的方法.可以先按字典序排序,然后弄一个栈,如果当前字串可以接到栈顶元素的后面,那么当 ...

ios多线程的几种创建方式以及基本使用

1.第一种,NSThread方法,此方法使用很少! 2.NSOperation,面向对象的多线程技术 3. NSObject多线程技术 4.苹果推荐使用的GCD技术 5.GDC中的队列

shell中的比较语句

Linux比较字符串.判断文件是否存在及是否可读等,通常用"[]"来表示条件测试. 注意:这里的空格很重要.要确保方括号的空格.笔者就曾因为空格缺少或位置不对,而浪费好多宝贵的时间 ...

openfire源码分析

启动流程 Socket接口 Socket通信使用Mina框架实现,是XMPP协议的处理入口,具体为: 消息接收后由不同的节处理器处理: StanzaHandler基础消息类型,之后进行消息路由: 最后 ...

SQL注入浅水攻防

啥是SQL注入(SQL Injection) 所谓SQL注入就是把SQL命令插入到表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令.在某些表单中,用户输入的内容直接用来构造 (或影响 ...

php之试触法----error--关键字的误用

实际开发中,在不同网页的输出中,常常有许多公共的代码或者变量需要使用,于是定义了以下类来缩减代码量 如下代码所示: <?php class universalClass { function w ...

Tensorflow datasets&period;shuffle repeat batch方法

机器学习中数据读取是很重要的一个环节,TensorFlow也提供了很多实用的方法,为了避免以后时间久了又忘记,所以写下笔记以备日后查看. 最普通的正常情况 首先我们看看最普通的情况: # 创建0-10 ...

一篇linux的通讯文章

今年的linux内核开发大会上,google的开发人员也上台做了名为“how google use linux”的演讲.我斗胆翻译注解一番――括号内为注解,欢迎读者斧正. 原文链接参见:http:// ...

Spring插件3&period;8&period;2的安装

主机环境:win8 64bit eclipse版本:4.5.2 MARS 插件版本:Spring Tool Suite3.8.2 安装过程:直接在线安装,没有先在官网把插件下载再安装. 主要步骤: 1 ...

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。