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

Object-oriented design pattern for object converter

我想知道什么是最好的 OOP 设计模式 应该适合我的场景。

场景:

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

促进从 A 类到新 B 类的转换的最佳 OOP 设计是什么?

目标:

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

示例:

A 类

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);
}

为 ClassB 使用带有参数 (ClassA) 的构造函数,反之亦然

ClassA(ClassB object){
...
}

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

interface Converter<T, R> {
  R convert(T obj);
}

您可以为您的 类 实现此接口:

class AtoBConverter implements Converter<ClassA, ClassB> {
  public ClassB convert(ClassA obj) {
    ...
  }
}

这假设 ClassA 有 public 方法允许您检查其状态,而 ClassB 有 constructor/setters 允许您修改其状态。严格来说,如果所有三个 类 都在同一个 java 包中,您可以将那些 methods/constructors 声明为私有包。

您绝对应该选择一个单独的处理程序 class 来处理此转换。

作为一个小的优化,你可以在这个处理程序上有静态 api's class 这样无论何时你想在两个对象之间执行转换你都不必实例化一个实例处理程序 class 也是如此。

例如:

假设您需要将类型 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