Decorator は Delegation を使用しますが、非常に特殊な方法で使用します。
委任 (または構成) は、他のいくつかのオブジェクトの使用を調整することによって複雑な動作を構築する一般的な方法ほどパターンではありません。多くの場合、セットまたは静的な方法で使用されます。「設定または静的」とは、次のような意味です。
class Delegator {
private final ClassA a = new ClassA();
private final ClassB b = new ClassB();
public void doWork() {
a.setup();
final ResFromA resa = a.getRes();
b.setup();
b.consume(resa);
}
}
Delegator は、ClassA または ClassB とタイプまたはインターフェースを共有せず、a と b の両方の正確なタイプを認識していることに注意してください。
デコレーターは、委任を使用して実行時に論理エンティティに動作を追加する動的な方法です。Decorator では、すべてのエンティティが共通のインターフェースを共有し、委任を使用してそれらの作業を連結します。
public interface Item {
public void drawAt(final int x, final int y);
}
public class CircleAround implements Item {
private final Item wrapped;
private final int radius;
public CircleAround(public final Item wrapped, public final int radius) {
this.wrapped = wrapped;
this.radius = radius;
}
public void drawAt(final int x, final int y) {
// First handle whatever we are wrapping
wrapped.drawAt(x,y);
// Then add our circle
Graphics.drawCircle(x, y, radius);
}
}
最初の例とは異なり、CircleAround はラップするアイテムの正確なタイプを認識せず、共通のインターフェイスを共有することに注意してください。