一个JAVA问题求解。主要是关于JAVA switch case 重构的策略模式

打菜鸟 发布于 2012/07/16 14:43
阅读 2K+
收藏 0

现在有一个switch case语句。但是case语句有30个。而且每个case之间就一个关系。我想问一下。我这个用策略模式来做。建立的接口实现类太多了。是否划算。、

另外。我想问一下有没有更好的这种方法来消除switch case(完全不用。不是工厂方法中还是要用的那种)。

 

或者有木有哪位大神知道:是否存在一个这样的方法:

Dictionary<String, oop> dict = new Hashtable<String, oop>();这个是策略模式定义

dict.put("1", OOp);
dict.put("2", OOp);

给了两个值。

现在我想get“1”的时候运行OOp的第一种方法。2的时候第二种方法。依次类推。是否存在这样的方法。

谢谢了。大哥大姐们

加载中
0
逝水fox
逝水fox

这个做法扩展起来很方便。Struts1.x的LookupDispatchAction大约就是你这思路,不过他后面OOp不是指定对象而是函数名。

其实你put的过程和写switch-case的过程也一样一长串代码。这样做我觉得最大好处是以后可以方便移植到配置文件里面。

打菜鸟
我是想知道它是怎么实现的。看看用到哪些库文件。我对库文件了解太少了。这些都网上看到的一些思路。结合我的东西。还差一点
逝水fox
逝水fox
回复 @打菜鸟 : 呃 这东西多少还是要自己写的,思路就是你说的这样
打菜鸟
哦。那个Struts那个东西不太熟悉。我先看看了么。谢了
0
戴威
戴威
好久没用过hashtable了
0
Jeky
Jeky

思路没问题,其他的地方都是语法级别的问题了。接口实现类多也没啥办法,尽量缓存一下吧,这是面向对象语言模拟函数式语言的尴尬。

Demo:

package test;

import java.util.HashMap;
import java.util.Map;

public class SwitchDemo{

    public void handle(int caseNum){
        if(!handlerMap.containsKey(caseNum)){
        	try{
        		//这里你自行修改一下对应位置
        		//详情建议仔细学习Java反射
        		Class clazz = Class.forName("test.SwitchMethod" + caseNum);
            	SwitchHandler handler = (SwitchHandler) clazz.newInstance();
            	handlerMap.put(caseNum, handler);
        	}catch(Exception e){
        		throw new RuntimeException("Can't find handler!", e);
        	}
        }
        
        handlerMap.get(caseNum).handle(caseNum);
    }

    public static void main(String[] args){
        SwitchDemo demo = new SwitchDemo();
        demo.handle(1);
    }

    public static interface SwitchHandler{
        void handle(int caseNum);
    }
    
    private Map<Integer, SwitchHandler> handlerMap = new HashMap<Integer, SwitchHandler>();
}

 

package test;

public class SwitchMethod1 implements SwitchDemo.SwitchHandler{

	@Override
	public void handle(int caseNum) {
		System.out.println("This is method 1");
	}

}

 

返回顶部
顶部