0

我尝试设计一台翻译服务器。我的本地系统中有一个 POJO 类 ( RootClass)。并且还有远程系统将远程对象(RemoteClass)发送到我的系统。该服务的职责是将 Remote 类转换为 Root 类。问题是:种类太多了。例如超过200种。我需要写大量的 if-else 来做这个翻译:

我列出了一些伪代码来描述这个问题。

public class RootClass  {
    public String type;
    public String attr1;
    public String attr2;
    public String attr3;
    public String attr4;
}


public class RemoteClass  {
    public String type;
    public String attr1;
    public String attr2;
    public String attr3;
}


public class Translator{

     public RootClass translate(RemoteClass remote) {
         RootClass root = new RootClass();

         if ("a".equals(remote.type ))  {
             root.type = "veryGood";
             if ("one".equals(remote.attr1)) {
                  root.attr2 = "true";
             }
             if ("two".equals(remote.attr1)) {
                 root.attr3 = "true";
             }
             if ("1".equals(remote.attr1) && "2".equals(remote.attr2) ) {
                 root.attr4 ="good";
             }

         } else if ("b".equals(remote.type)) {
             root.type = "good";
             if ("one".equals(remote.attr1)) {
                 root.attr2 = "1";
             } else if ("two".equals(remote.attr1)) {
                 root.attr2 ="2";
             }

         }  else if ("c".equals(remote.type)) {
             root.type = "good";
             if (remote.attr2.indexOf(":") > 0 )  {
                 String[] strArray = remote.attr2.split(":");
                 root.attr2=strArray[0];
                 root.attr3=strArray[1];
             }

         }

     }
}

2 个对象用完全不同的结构描述 1 个事物。根类是我们系统的内核,不可能支撑,我们也认为这个根类非常适合本地系统。并且对于远程类来自我们无权更改的第 3 方系统。所以这个翻译变得非常困难。

我计划删除的是创建 200 多个翻译采用者:例如:

public class adopterA implements RootAdoper {
public RootClass translate(RemoteClass remote) {
    RootClass root = new RootClass();
    root.type="veryGood";
    if ("one".equals(remote.attr1)) {
        root.attr2 = "true";
    }
    if ("two".equals(remote.attr1)) {
        root.attr3 = "true";
    }
    if ("1".equals(remote.attr1) && "2".equals(remote.attr2) ) {
        root.attr4 ="good";
    }
}

}

并将所有这些放入 HasMap

Map<String, RootAdoper> map = new HashMap<String, RootAdoper>();

但是仍然有 200 个小类来包装 if/else,有什么好的模式或设计来解决这个复杂的问题吗?提前致谢。

4

1 回答 1

1

你的地图中的关键是什么?如果关键是Remote.type那么你可以做

rootClass = map.get(remote.type).translate(remote);

这确实摆脱了 if/else if 块。只要确保处理未知/未翻译的区域,或者有一个NullObject不翻译或执行默认翻译的区域。

Refactoring to Patterns一书中的技术名称称为“Replace Conditional Dispatcher with Command”

不过,您仍然必须填充地图。也许做到这一点的一种方法是使所有RootAdoper接口成为枚举,而所有实现都成为枚举中的类型。您还可以向枚举添加一个新方法,以获取每个值都可以转换的 Remote.Type。

enum RootAdoper{

     A{
        @Overide
        public RootClass translate(RemoteClass remote){
           //...
        }

        @Override
        public String getTypeToTranslate(){  
            return "A";
        }
     },
     ... // other types listed here similarly
     ;

  abstract RootClass translate(RemoteClass remote); 

  abstract String getTypeToTranslate();
}

然后你可以像这样填充地图

 Map<String, RootAdoper> map = new HashMap<String, RootAdoper>();

 for(RootAdoper adoper : RootAdoper.values(){
        map.put(adoper.getTypeToTranslate(), adoper);
 }
于 2013-10-16T15:56:34.320 回答