猿问
下载APP

将许多“if else”语句转换为更清晰的方法

将许多“if else”语句转换为更清晰的方法

我的代码在这里检测是否mimeType等于某种MIME类型,如果是,它将进行某种转换

public void convertToMp3(File src, File target,String mimeType){
    if(mimeType.equals("audio/mpeg")){
        ...
    }else if(mimeType.equals("audio/wav")){
        mp3ToWav();
    }else if(mimeType.equals("audio/ogg")){
        ...
    }else if(...){
    ... //More if and else here}

我缩短了我的代码,因为它有很多其他if语句,什么设计模式适合删除许多ifelseif语句?


30秒到达战场
浏览 52回答 3
3回答

德玛西亚99

你可以有一个Converter界面。然后你可以为每个Mimetype创建一个类,如:public&nbsp;interface&nbsp;Converter&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;convertToMp3(); &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;convertToOgg();}public&nbsp;class&nbsp;MpegConverter&nbsp;implements&nbsp;Converter&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;convertToMp3()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Code&nbsp;here &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;convertToOgg()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Code&nbsp;here &nbsp;&nbsp;&nbsp;&nbsp;}}对于每个转换器,您都需要这样的类。然后你可以设置这样的地图:Map<String,&nbsp;Converter>&nbsp;mimeTypeMap&nbsp;=&nbsp;new&nbsp;HashMap<String,&nbsp;Converter>();mimeTypeMap.put("audio/mpeg",&nbsp;new&nbsp;MpegConverter());然后你的convertToMp3方法变成这样:Converter&nbsp;converter&nbsp;=&nbsp;mimeTypeMap.get(mimeType);converter.convertToMp3();使用这种方法,您可以在将来轻松添加不同的转换器。所有未经测试的,可能都没有编译,但你明白了

千万里不及你

如果使用pre-JDK7,则可以为所有MIME类型添加枚举:&nbsp;&nbsp;public&nbsp;static&nbsp;enum&nbsp;MimeTypes&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MP3,&nbsp;WAV,&nbsp;OGG&nbsp;&nbsp;} &nbsp;&nbsp;public&nbsp;class&nbsp;Stuff&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;... &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(MimeTypes.valueOf(mimeType))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;MP3:&nbsp;handleMP3();&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;WAV:&nbsp;handleWAV();&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;OGG:&nbsp;handleOGG();&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;}

慕田峪9158850

考虑使用策略设计模式和a&nbsp;Map调度到适当的策略。如果你需要额外的功能,除了特定mimeType的转换,或转换器是大而复杂的代码,你会希望将每个转换器放在自己的.java文件中。&nbsp;interface&nbsp;Convertor&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;convert(File&nbsp;src,&nbsp;File&nbsp;target); &nbsp;} &nbsp;private&nbsp;static&nbsp;void&nbsp;convertWav(File&nbsp;src,&nbsp;File&nbsp;target)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;... &nbsp;} &nbsp;... &nbsp;private&nbsp;static&nbsp;final&nbsp;Map<&nbsp;String,&nbsp;Convertor&nbsp;>&nbsp;convertors&nbsp;=&nbsp;new&nbsp;...; &nbsp;static&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;convertors.put("audio/wav",&nbsp;new&nbsp;Convertor&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;convert(File&nbsp;src,&nbsp;File&nbsp;target)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;convertWav(src,&nbsp;target); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;convertors.put("audio/ogg",&nbsp;new&nbsp;Convertor&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;convert(File&nbsp;src,&nbsp;File&nbsp;target)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;convertOgg(src,&nbsp;target); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;... &nbsp;} &nbsp;public&nbsp;void&nbsp;convertToMp3(File&nbsp;src,&nbsp;File&nbsp;target,&nbsp;String&nbsp;mimeType){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;Convertor&nbsp;convertor&nbsp;=&nbsp;convertors.get(mimeType); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(convertor&nbsp;==&nbsp;null&nbsp;)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;... &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;convertor.convert(src,&nbsp;target); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;}
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答