Java 面向对象的对象转换器设计模式
我想知道应该为我的场景设置什么样的最佳OOP设计模式 场景: 我有两个班,A班和B班。我想将ClassA转换成一个新的ClassB,但是ClassA可能会更改其成员变量和方法。这意味着可能必须更新将ClassA转换为ClassB的方式 为了促进从ClassA到新ClassB的转换,最好的OOP设计是什么 目标: 创建一个设计模式,允许轻松更改将ClassA转换为ClassB的方式 示例: 甲级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
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”一起使用。函数有一些附加的高阶函数与其他函数连接。最好添加一些示例。