问题
我有一个大类(大约 1500 LOC),它使用不同的“策略”将数据从一个对象转换为另一个对象。我这里有那个类的代表:
public class FooService implements FooProcessing {
FooRequestTransformer fooRequestTransformer;
AnotherService anotherService;
InstanceVar1 iVar1;
InstanceVar2 iVar2;
...
这个类使用了一个接口(类外部):
interface TransformerStrategy {
public FooRequest transform(FooResponse response);
}
哪个被传递到这个方法中(在 FooService 类中):
private FooResponse getResponse(FooResponse fooResponse, TransformerStrategy transformerStrategy) {
FooRequest fooRequest = transformerStrategy.transform();
fooResponse = anotherService.bar(fooRequest);
return fooResponse;
}
入口点在这里,它使用该getResponse()
方法并TransformerStrategy
匿名创建:
public List<Foo> getFooForSomeFlow1(Param1 param1, Param2 param2, ...){
FooResponse fooResponse = anotherService.baz(fooRequest);
TransformerStrategy myTransformerStrategy = new TransformerStrategy() {
public FooRequest transform(FooResponse fooResponse) {
fooRequestTransformer.transform(param1, param2, iVar1, iVar2)
}
}
FooResponse fooResponse = getResponse(fooResponse, myTransformerStrategy);
...//other code
}
现在的问题是:有几种方法,如getFooForSomeFlow1()
(inside FooService
),它们都有自己的匿名实现,TransformerStrategy
随后调用getResponse()
。正如您可以想象的那样,这非常混乱,并且在您调试时令人困惑(即您正在进入getResponse()
,然后突然又回到了getFooForSomeFlow1()
)
可能的解决方案
一种可能的解决方案(想到的)是将这些不同的策略组织成一个“提供者”类,该类将以某种方式将它们组合在一起。奇怪的是,这个类已经包含了这种类型的 Provider 类:
protected class StrategyProvider {
public ABCTransformerStrategy newABCTransformerStrategy(FooRequestTransformer transformer, Param1 param1, Param2 param2) {
return new ABCTransformerStrategy(transformer, param1, param2);
}
}
protected class ABCTransformerStategy implements TransformerStrategy {
protected FooRequestTransformer transformer;
protected Param1 param1;
protected Param2 param2;
//...constructor here
//...overridden transform method as above
}
在其中一条评论中说,“出于测试目的,将匿名类转换为内部类”。然而,他们只改变了其中一个人,而留下了其余的人。所以就像他们开始重构过程并在中间停止。
所以,我想我可以完成重构并将所有匿名类移动到内部类,然后最终将这些类移出StrategyProvider
到外部类。问题是“将匿名转换为内部”增加了更多样板文件(见ABCTransformerStrategy
上文;我必须将所有数据传递给构造函数),我不确定通过这个重构过程可以获得多少。
我有两个问题:
- 我应该继续这种方法吗?
- 或者是否有另一种我可以应用的设计模式更合适并真正简化此代码?
谢谢