-1

我有一个基本实现的MyService接口。MyServiceImpl我包装MyServiceImpl成一个MyService装饰器链。

为此,我创建了MyServiceDelegate一个抽象类,它接受一个MyService实例并将所有服务调用委托给提供的MyService实例。

但是在我的单元测试中,出于特定的需要,我需要找回 的第一个真正实现MyService,即MyServiceImpl,并且我只有一个MyServicewhich 指的是装饰器。

我只是想知道是否有可能使用 Guava,以一种功能性的方式进行递归,这将返回我已经装饰有很多层并且不是委托服务的“原始服务”。我想使用像 Function 这样的函数来返回委托服务,或者如果它是原始服务,则返回 null,但不知道要使用它。

我知道我可以通过 while 循环轻松做到这一点,而且我不是在寻找替代解决方案。只是想知道Guava是否可以解决这些问题。

4

1 回答 1

7

你甚至不需要 while 循环或 Guava。只需在您的界面中添加以下方法:

public MyService undecorate();

然后在委托中执行以下实现:

return decoratedService.undecorate();

以及“真实”实现中的以下实现:

return this;

如果无法修改接口,请在外部进行:

public MyService undecorate(MyService service) {
    if (service instanceof MyServiceDelegate) {
        return undecorate(((MyServiceDelegate) service).getDecoratedService());
    }
    else {
        return service;
    }
}
于 2012-09-14T14:06:58.653 回答