我有一个特殊的案例,我实现了构建器模式。变量之一是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来回转换(反之亦然)的所有“丑陋”逻辑。