转换对象的设计

时间:2009-06-20 02:52:41

标签: java design-patterns

我正在努力想出一个很好的设计,将一组不同的对象转换为一个共同的对象。基本上,我从系统A收到一个(许多略有不同的)复杂对象,并且必须将其转换为系统B的更简单的对象。

我正在转换的对象都是从同一个基类继承的,因此部分转换始终是相同的。但在每种情况下,转换确实涉及一些非常特定于我正在转换的对象类型的东西。它可以是RPC,HTTP提取,数据库查找或完全不同的东西。

我正在查看Template methodStrategy模式。但似乎都不是完美契合。问题是使用的方法/策略与被转换的对象类型有关,因此不可互换。

这是我正在考虑做的草图:

class FooConverter {
    Map<String, FooConverter> converters;
    Foo convert(Bar bar) {
        Foo foo = ...;  // Common part of the conversion.
        FooConverter c = converters.get(bar.getType(), foo);
        c.finishConversion(bar, foo);
        return foo;
    }
}

让我烦恼的是FooConverter必须定义一个额外的转换方法,该方法将部分转换的对象作为参数。所以我最终混合使用策略(因为所有转换器都实现相同的接口)和模板方法(因为转换的公共部分由所有转换器共享)。还有更好的方法吗?

4 个答案:

答案 0 :(得分:2)

你正在使用一堆“可转换”对象,也许你可以让“Foo”为每个“Convertable”基类型都有装饰器,当你检测到“可转换”类型时,你可以将相应的装饰器添加到“Foo” “?

答案 1 :(得分:2)

听起来你需要遍历一个结构,并能够对结构中的每个元素做一些事情。这个'某事'因元素的类型而异,你也希望能够改变 这个'某事'的实现方式。

如果是这种情况,它听起来非常适合访客模式。我最近在一个与你很相似的场景中使用它,我需要以灵活的方式将一个结构转换为另一个结构。

答案 2 :(得分:1)

至少有两种方法可以做到:

  1. 使用模板方法。那是在超类(Bar)中有一个转换方法,并在子类中实现它(例如,MyBar,HttpBar等)。只要类知道如何转换自己就可以了。您可以在Bar中使用方法toFoo()。子类将调用super.toFoo()并另外执行所需的操作。
  2. 上述方法可能并不总是令人满意,因为概念转换不是Bar的工作。在这种情况下,您可以使用访客模式。您可以拥有转换类的并行层次结构。每个类都可以接受某种特定类型的Bar并进行转换。

答案 3 :(得分:0)

您可以为要转换的每个给定类型实现目标类型的子类和构造函数。从构造函数中调用其父类型的重载构造函数。

类似的东西:

public class ConvertedFoo extends Foo
{
    public ConvertedFoo(SuperTypeA a) {
        // Do some common stuff here.
    }

    public ConvertedFoo(SubtypeOfSuperTypeA a) {
        ConvertedFoo((SuperTypeA)a);
        // Do more specific stuff here.
    }
}

如果ConvertedFoo类太大,可以很容易地将其拆分为子类型。

这将允许最大限度地重复使用代码,并且无需使用动态类型检查即可集中所有转换代码。

我不认为这是一个命名模式。如果有人知道,我想知道它的名字。