繁体   English   中英

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

[英]Object-oriented design pattern for object converter

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

场景:

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

促进从 ClassA 到新 ClassB 的转换的最佳 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);
}

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

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

你可以为你的类实现这个接口:

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

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

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

ClassA(ClassB object){
...
}

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

作为一个小优化,您可以在此处理程序类上使用静态 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM