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

问题

我的代码在这里检测到mimeType是否等于某个MIMEtype,如果是,它会做一定的转换

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语句,什么设计模式适合删除manyifandelseorelse if语句?


#1 热门回答(191 赞)

你可以有aConverter接口。然后你可以为每个Mimetype创建一个类,如:

public interface Converter {

    public void convertToMp3();
    public void convertToOgg();

}

public class MpegConverter implements Converter {

    public void convertToMp3() {
        //Code here
    }

    public void convertToOgg() {
        //Code here
    }

}

对于每个转换器,你都需要这样的类。然后你可以设置这样的 Map :

Map<String, Converter> mimeTypeMap = new HashMap<String, Converter>();

mimeTypeMap.put("audio/mpeg", new MpegConverter());

那么yourconvertToMp3方法就像这样:

Converter converter = mimeTypeMap.get(mimeType);
converter.convertToMp3();

使用这种方法,你可以在将来轻松添加不同的转换器。

所有未经测试的,可能都没有编译,但你明白了


#2 热门回答(23 赞)

如果你使用pre-JDK7,你可以为allMIMEtypes添加一个枚举:

public static enum MimeTypes {
      MP3, WAV, OGG
  }

  public class Stuff {
      ...
      switch (MimeTypes.valueOf(mimeType)) {
          case MP3: handleMP3(); break;
          case WAV: handleWAV(); break;
          case OGG: handleOGG(); break;
      }
  }

并看看Stack Overflow questionJava - Convert String to enum如何将字符串转换为枚举。


#3 热门回答(15 赞)

考虑使用策略设计模式和aMap调度到适当的策略。除了转换特定的mimeType之外,如果你需要其他功能,或者转换器是大而复杂的代码,并且你希望将每个转换器放在其自己的.java文件中,则特别有用。

interface Convertor {
    void convert(File src, File target);
 }

 private static void convertWav(File src, File target) {
    ...
 }

 ...

 private static final Map< String, Convertor > convertors = new ...;
 static {
    convertors.put("audio/wav", new Convertor {
       void convert(File src, File target) {
          convertWav(src, target);
       }
    });
    convertors.put("audio/ogg", new Convertor {
       void convert(File src, File target) {
          convertOgg(src, target);
       }
    });
    ...
 }

 public void convertToMp3(File src, File target, String mimeType){
     final Convertor convertor = convertors.get(mimeType);
     if (convertor == null ) {
        ...
     } else {
        convertor.convert(src, target);
     }
 }