これを実現するためのデザインパターンは、デコレータパターンです。 Guavaの作者が、このタイプの要求に対して転送先となるものを設計した方法を見てみる価値があります。ここで
は、例えば抽象クラスForwardingListenableFuture
から抽出されたいくつかのコードです:
/**
* A {@link ListenableFuture} which forwards all its method calls to another
* future. Subclasses should override one or more methods to modify the behavior
* of the backing future as desired per the <a
* href="http://en.wikipedia.org/wiki/Decorator_pattern">decorator pattern</a>.
*
* <p>Most subclasses can just use {@link SimpleForwardingListenableFuture}.
*
* @param <V> The result type returned by this Future's {@code get} method
*
* @author Shardul Deo
* @since 4.0
*/
public abstract class ForwardingListenableFuture<V> extends ForwardingFuture<V> implements ListenableFuture<V> {
/** Constructor for use by subclasses. */
protected ForwardingListenableFuture() {}
@Override
protected abstract ListenableFuture<V> delegate();
@Override
public void addListener(Runnable listener, Executor exec) {
delegate().addListener(listener, exec);
}
...
することができますように、このクラスの責任はListenableFuture
をラップし、クライアントへの実際の実装を隠すことである - 最後の両方のユーザーdelegate()
メソッドが具体的な型の代わりにListenableFuture
を返すのを見ると、実装者は、
実際が包まれ、将来にset
を呼び出すためのクライアントを防ぐことができますあなたがラップにニーズを非表示にするかForwardingListenableFuture
の実装とそれを「飾る」実装ListenableFuture
オブジェクトを、作成するコード。 javadocが示唆しているように、SimpleForwardingListenableFuture
のサブクラス化は、委任されたメソッドに潜在的な副作用を導入することなく、その仕事を行います。
そういえば、そう、私もキャンセルを気に!今すぐ失敗したテストを書く。これを指摘してくれてありがとう。 – tariksbl