我有一个特殊的案例,我实现了构建器模式。变量之一是ExternalClassA类型,而传递给builder的参数是InternalClassA类型。目前,我已经使用了类似下面的方法:

Class Parent {
   String variableX;
   int variableY;
   ExternalZ variableZ;
   public static builder {
   ....
   ExternalZ varz;
   /* .. builder logic */
   private builder withExternalZ(InternalZ internalZ) { //This is the transform method I'm using currently
   this.variableZ.getSomeObject().setX(this.internalZ.getSomeObject().getX()); //Similar kind of lines making my transform method look ugly
    }
}


有什么方法可以使我的withExternalZ方法看起来更简单?目前,我正在考虑实现Mapper模式或Java8函数(如中所述)。映射器似乎不是一个好选择,因为我只需要单向转换。

如果有人有更好,更简单的方法,请分享。

最佳答案

当前,您正在将InternalZ实例传递给withExternalZ()方法,该实例实际上需要\期望一个ExternalZ对象。但是您拥有的是InternalZ方法。

适配器模式是为此类方案而构建的,因为它可以将目标接口(InternalZ)适配/转换为客户端期望的接口(ExternalZ)。简而言之,您需要编写一个将InternalZ转换为ExternalZ对象的适配器。适配器类代码大致如下:

public class IntToExtZAdapter extends ExternalZ{
  InternalZ internalZ=null;
  public IntToExtZAdapter(InternalZ internalZ){
    this.internalZ=internalZ;
  }
  public X getX(){
   //Logic for getting X from internalZ object in adapter
  }
  public setX(X x){
   //Logic for setting X in internalZ object in adapter
  }
  //...and so on
 }


然后,而不是这样做-

private builder withExternalZ(InternalZ internalZ) { //This is the transform method I'm using currently
this.variableZ.getSomeObject().setX(this.internalZ.getSomeObject().getX()); //Similar kind of lines making my transform method look ugly
}


您现在要做的是-

this.variableZ=new IntToExtZAdapter (internalZ);


现在,您可以按原样使用variableZ,并且在内部,IntToExtZAdapter将从InternalZ适应/转换为ExternalZ,然后再转换为ExternalZ。

现在,在适配器内部“隐藏”了从InternalZ到ExternalZ来回转换(反之亦然)的所有“丑陋”逻辑。

10-01 03:23