-1

MyService基本的な実装のインターフェースがありますMyServiceImpl。私はデコレータMyServiceImplのチェーンに包み込みます。MyService

そのために、インスタンスを取得し、提供されたインスタンスにすべてのサービス呼び出しを委任するMyServiceDelegate抽象クラスであるを作成しました。MyServiceMyService

しかし、私の単体テストでは、特定のニーズのために、の最初の実際の実装を見つける必要があります。MyServiceこれは、デコレータを参照するMyServiceImplだけです。MyService

Guavaを使用して、多くのレイヤーで装飾され、デリゲートサービスではない「元のサービス」を返す機能的な方法で再帰を実行できるかどうか疑問に思います。デリゲートサービスを返すFunctionのような関数を使用することを考えています。元のサービスの場合はnullを使用することを考えていますが、それを使用するかどうかはわかりません。

私はwhileループで簡単にそれを行うことができることを知っています、そして私は代替の解決策を探していません。グアバがこの種の問題を解決できるかどうかを知りたいだけです。

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 に答える