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

时间:2019-07-12 15:16:58

标签: java oop object design-patterns object-oriented-analysis

我想知道哪种最佳的 OOP设计模式适合我的情况。

场景:

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

将这种从ClassA转换为新ClassB的最佳OOP设计是什么?

目标:

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

示例:

ClassA

public class ClassA {
    private String actionName;

    // With some getters & setters
}

ClassB

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

3 个答案:

答案 0 :(得分:1)

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

rabbitmq-users

答案 1 :(得分:1)

您需要一个具有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包中,则可以将那些方法/构造函数声明为私有包。

答案 2 :(得分:0)

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

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