Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 面向对象的对象转换器设计模式_Java_Oop_Object_Design Patterns_Object Oriented Analysis - Fatal编程技术网

Java 面向对象的对象转换器设计模式

Java 面向对象的对象转换器设计模式,java,oop,object,design-patterns,object-oriented-analysis,Java,Oop,Object,Design Patterns,Object Oriented Analysis,我想知道应该为我的场景设置什么样的最佳OOP设计模式 场景: 我有两个班,A班和B班。我想将ClassA转换成一个新的ClassB,但是ClassA可能会更改其成员变量和方法。这意味着可能必须更新将ClassA转换为ClassB的方式 为了促进从ClassA到新ClassB的转换,最好的OOP设计是什么 目标: 创建一个设计模式,允许轻松更改将ClassA转换为ClassB的方式 示例: 甲级 public class ClassA { private String actionName

我想知道应该为我的场景设置什么样的最佳OOP设计模式

场景:

我有两个班,A班和B班。我想将ClassA转换成一个新的ClassB,但是ClassA可能会更改其成员变量和方法。这意味着可能必须更新将ClassA转换为ClassB的方式

为了促进从ClassA到新ClassB的转换,最好的OOP设计是什么

目标:

创建一个设计模式,允许轻松更改将ClassA转换为ClassB的方式

示例:

甲级

public class ClassA {
    private String actionName;

    // With some getters & setters
}
B类

public class ClassB {
    private String action; // Note the subtle difference

    // With some getters & setters
}
处理者

public class Handler {
    ClassB classB = new ClassB();

    // Convert ClassB to ClassA

    This.publish(ClassA);
}

将构造函数与参数(ClassA)一起用于ClassB,反之亦然

ClassA(ClassB object){
...
}

您需要一个既了解类a又了解类B的所有成员的类型。将ClassA或ClassB相互耦合是个坏主意,因此您通常会看到第三种类型实现如下接口:

interface Converter<T, R> {
  R convert(T obj);
}
接口转换器{
R转换(T-obj);
}
您可以为您的类实现此接口:

class AtoBConverter implements Converter<ClassA, ClassB> {
  public ClassB convert(ClassA obj) {
    ...
  }
}
类AtoBConverter实现转换器{
公共ClassB转换(ClassA obj){
...
}
}

这假设ClassA具有允许您检查其状态的公共方法,ClassB具有允许您修改其状态的构造函数/设置器。严格地说,如果这三个类都在同一个java包中,那么可以将这些方法/构造函数声明为包私有。

您肯定应该选择单独的处理程序类来处理此转换

作为一个小小的优化,您可以在这个处理程序类上使用静态api,这样每当您希望在两个对象之间执行转换时,就不必同时实例化处理程序类的实例

例如:

假设您需要将类型A的对象转换为类型B的对象。 你的转换器可能看起来像

class AToBConverter {
    
   public static B convert(A objA){
       //business logic to convert objA to objB
       return objB;
   } }
这里的优点是,每当您需要将类型A的对象转换为B时,您只需执行以下操作:

B objB = AToBConverter.convert(objA); //Note how we don't need to create an instance of the converter

您是否可以使用公共类a(类b){…}之类的构造函数?您可能对动态更改的反射感兴趣。然而,你会提供一个例子吗?只使用mapstruct?这是一个选项,但它需要为ClassA对象编写一个疯狂的长构造函数&我想避免这种情况。这个解决方案的问题是它将ClassA和ClassB耦合在一起。我肯定会选择Leffebrune提出的解决方案,这似乎是最好的解决方案,是否有任何设计模式可以将Init与这个概念松散地联系起来?转换器接口实际上与Java的函数接口相同。由于这是一个功能接口,您还可以使用lambda实现它,并将其与流上的“map”一起使用。函数有一些附加的高阶函数与其他函数连接。最好添加一些示例。