我正在努力想出一个很好的设计,将一组不同的对象转换为一个共同的对象。基本上,我从系统A收到一个(许多略有不同的)复杂对象,并且必须将其转换为系统B的更简单的对象。
我正在转换的对象都是从同一个基类继承的,因此部分转换始终是相同的。但在每种情况下,转换确实涉及一些非常特定于我正在转换的对象类型的东西。它可以是RPC,HTTP提取,数据库查找或完全不同的东西。
我正在查看Template method和Strategy模式。但似乎都不是完美契合。问题是使用的方法/策略与被转换的对象类型有关,因此不可互换。
这是我正在考虑做的草图:
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
必须定义一个额外的转换方法,该方法将部分转换的对象作为参数。所以我最终混合使用策略(因为所有转换器都实现相同的接口)和模板方法(因为转换的公共部分由所有转换器共享)。还有更好的方法吗?
答案 0 :(得分:2)
你正在使用一堆“可转换”对象,也许你可以让“Foo”为每个“Convertable”基类型都有装饰器,当你检测到“可转换”类型时,你可以将相应的装饰器添加到“Foo” “?
答案 1 :(得分:2)
听起来你需要遍历一个结构,并能够对结构中的每个元素做一些事情。这个'某事'因元素的类型而异,你也希望能够改变 这个'某事'的实现方式。
如果是这种情况,它听起来非常适合访客模式。我最近在一个与你很相似的场景中使用它,我需要以灵活的方式将一个结构转换为另一个结构。
答案 2 :(得分:1)
至少有两种方法可以做到:
答案 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
类太大,可以很容易地将其拆分为子类型。
这将允许最大限度地重复使用代码,并且无需使用动态类型检查即可集中所有转换代码。
我不认为这是一个命名模式。如果有人知道,我想知道它的名字。