112

我的代码在这里检测是否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
}

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

4

7 回答 7

192

你可以有一个Converter接口。然后您可以为每个 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<String, Converter> mimeTypeMap = new HashMap<String, Converter>();

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

然后你的convertToMp3方法变成这样:

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

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

所有未经测试,可能无法编译,但你明白了

于 2013-01-03T10:17:11.310 回答
23

如果您使用的是 JDK7 之前的版本,您可以为所有MIME类型添加一个枚举:

  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 问题Java - Convert String to enum,了解如何将字符串转换为枚举。

于 2013-01-03T10:28:27.840 回答
15

考虑使用 Strategy 设计模式和 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);
     }
 }
于 2013-01-08T13:59:48.117 回答
3

如果您为每种情况运行相同的方法,您应该检查状态模式

于 2013-01-03T10:14:49.313 回答
2

这绝对是一种策略设计模式。但是您的总体设计存在很大问题。使用 String 来识别类型并不是一个好的编程习惯。仅仅是因为它很容易编辑,而且你可能会犯语法错误,然后整个下午都在寻找编程错误。您可以避免使用地图<>。

我建议如下:

  1. 扩展类文件。新类向 File 类添加了一个新属性 FileType 和一个新方法 convertTo(FileType)。这个属性持有它的类型:“audio”,“wav”......并且再次不要使用字符串,使用枚举。在这种情况下,我将其称为 FileType。随心所欲地扩展文件:WavFile、AudioFile...
  2. 使用 Strategy dp 创建您的转换器。
  3. 使用 Factory dp 来初始化转换器。
  4. 由于每个 File 都知道自己的类型和目标类型(使用 convertTo() 方法指定目标类型),它将调用工厂自动获取正确的转换器!!!

这种设计是可扩展的,您可以根据需要添加尽可能多的 FileType 和转换器。您投票的答案具有误导性!!!!编码和黑客之间有很大的区别。

于 2013-01-09T22:43:53.490 回答
2

如果您正在使用JDK 7,则可以使用switch-case构造:

请参阅:为什么我不能打开字符串?

对于以前的版本,if-else是唯一的选择。

于 2013-01-03T10:14:20.120 回答
0

如果您不使用 Java 7,则可以创建一个enum并将该值与switchcase 一起使用。然后你只需要传递枚举值(而不是文件,我不知道你为什么这样做)。它看起来也会更整洁。

这些应该有助于您想要做的事情:

 [Java Enum Examples][1] - 
 [Java Switch Case examples][2]
于 2013-01-03T10:28:44.673 回答