面向对象与IF-ElSE
我们这里要讨论的问题是,对于代码中出现了很多的IF-Else,我们如何处理
我之前写了个代码,要求对输入的不同字符作不同处理,所以写了很多IF-Else,后来,需求增加,也就是增加了一些判断,我把所有的半段都提出来放到了一个方法里,利用flag进行表示处理,虽然解决了需求的扩展问题,但是大量的IF-Else没有得到处理,当然如果输入的字符种类很少,我想没必要处理[当时只有4种],但是如果输入的字符种类便多了,怎么办?当然不能再用IF-Else了。
[1、] 其实处理办法是有的,如果应用命令模式,但其实只是分散了IF-ELSE,但并没有解决实质性问题。
public void process(char inChar){//原来未使用命令模式的处理
if(inChar == 'A'){......}
if(inChar == 'B'){......}
if(inChar == 'C'){......}
if(inChar == 'D'){......}
...............................
}
使用命令模式:
public Interface Handle{public void doSome(char inChar);}
public class HandleACommand{
public void doSome(char inChar){//这里其实是分散了if的处理方式,使其不用集中处理
if(inChar == 'A'){//do some thing . }
}
}
public class HandlBCommand{
public void doSome(char inChar){//这里其实是分散了if的处理方式,使其不用集中处理
if(inChar == 'B'){//do some thing . }
}
}
//now we call process with command pattern
public void process(char inChar){//原来未使用命令模式的处理
private Handle handleA = new HandleACommand();//这里也可以使用DI方式注入
private Handle handleB = new HandleBCommand();//这里也可以使用DI方式注入
.....................................
handleA.doSome(inChar);
handleB.doSome(inChar);
handleC.doSome(inChar);
handleD.doSome(inChar);
...............................
}
[2、] 使用Java反射机制
另外一种解决方法是Java的反射机制。通过输入的字符合成不同的方法,扩展问题很好解决,每增加一个命令,就增加一个方法,但是会出现大量的方法。性能上不用我说大家也知道,会比不用反射机制慢1个数量级,当然它可以解决问题。
public void process(char inChar){
tyr{
final Method handleMethod = this.getClass().getMethod("handle" + inChar);
handleMethod.invoke(this);
}catch(NoSuchMethodException ex){//do exception.......}
}catch(IllegalAccessException ex}{//do exception.......}
}catch (InvocationTargetException ex){//do exception.......}
private void handleA(inChar){//do some thing.}
private void handleB(inChar){//do some thing.}
private void handleC(inChar){//do some thing.}
private void handleD(inChar){//do some thing.}
}
[3、] 利用state模式处理
下面是用的最多的处理办法,利用State模式进行处理。这也是处理此类问题使用最多的一种模式。当然也不是万能的,只是让大家首先考虑这个模式而已。但是这样会增加子类的数量。
public interface State {public void handle();}
public class ConcreteState_ONE {
public void handle(){//do some thing. }
}
public class ConcreteState_TWO {
public void handle(){//do some thing. }
}
public class ConcreteState_Default {
public void handle(){//do some thing. }
}
..............................................
public class CoreProcess {
private static final int STATE_ONE = 0;
private static final int STATE_TWO = 1;
private static final int STATE_THREE = 2;
private static final int STATE_FOUR = 3;
..........................................
private State initState = new ConcreteState_Default();
public void changeState(int stateNum){
switch(stateNum){
case STATE_ONE : initState = new ConcreteState_ONE(); break;
case STATE_TWO : initState = new ConcreteState_TWO(); break;
......................................................
default : initState = new ConcreteState_Default();
}
}
public void requestCommand(){
initState.handle();
}
}
//客户调用
public class Context{
public static void main(String[] args){
CoreProcess coreProcess = new CoreProcess();
coreProcess.changeState(CoreProcess.STATE_ONE);
coreProcess.requestCommand();
..............................................
coreProcess.changeState(CoreProcess.STATE_THREE);
coreProcess.requestCommand();
....................................
}
}
总结,但是在提出的汽车问题中,输入的字符扩展有限(或者说输入字符种类不回很多),不应该过度设计,当然那也是时间有限,过度设计最可怕的是它会分散你的思维,让你有限的精力浪费在不应该