问题
我有一个大类(大约1500行代码),它使用不同的“策略”将数据从一个对象转换为另一个对象。 这里是该类的表示:
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()
(在FooService
内)这样的几个方法,它们都有自己的TransformerStrategy
匿名实现,并随后调用getResponse()
。你可以想象,这非常混乱,而且在调试时很容易让人感到困惑(即你正在进入getResponse()
,然后突然回到了getFooForSomeFlow1()
)。
可能的解决方案
一个可能的解决方案(我想到的)是将这些不同的策略组织成一个“提供者”类,以某种方式将它们组合在一起。奇怪的是,这个类已经包含了这种类型的提供者类: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
;我必须将所有数据传递给构造函数),而我并不确定通过进行此重构过程能够获得多少好处。我的两个问题是:
- 我应该继续使用这种方法吗?
- 还是有其他设计模式可以应用,可以更合适地简化这段代码?