-1

私はすでにこの質問を見てきましたここにリンクの説明を入力してください

しかし、なぜ2つのオブジェクトの間に構成があるのか​​ についての答えを見つけることができないようです

UML へのリンクは次のとおりです。

ここにリンクの説明を入力

合成がある理由を説明できる人はいますか? または、一般化以外に何かがあるべき理由は何ですか?

4

1 に答える 1

1

デコレータ パターンのポイントは、含まれているコンポーネントを装飾することです。

public interface Logger {
    void print(String message);
}

public class ConsoleLogger implements Logger {
    @Override
    public void print(String message) {
        System.out.println(message);
    }
}

public class FileLogger implements Logger {
    @Override
    public void print(String message) {
        // TODO write the message to a file
    }
}

public WithCurrentDateLoggerDecorator implements Logger {
    private Logger delegate;

    public WithCurrentDateLoggerDecorator(Logger delegate) {
        this.delegate = delegate;
    }

    @Override
    public void print(String message) {
        message = new Date() + " - " + message;
        delegate.print(message);
    }
}

上記を使用すると、他のロガーを使用する場所ならどこでもデコレーターを使用でき、デコレーターはあらゆる種類のロガー (コンソール、ファイル、電子メール、ソケットなど) を装飾できます。具体的なロガーが何をするか (コンソールに出力するか、ファイルに出力するか) は気にしません。デリゲート ロガーにメッセージを出力させる前に、メッセージに現在の日付を追加して、具体的なロガーを装飾するだけです。

構成 (または委譲) なしでこれを行う必要がある場合は、 と を作成する必要がありますWithCurrentDateFileLogger(WithCurrentDateConsoleLogger具象ロガーごとに 1 つのサブクラスを追加します)。また、その他すべての装飾または具体的なロガー タイプでは、組み合わせの数が多いため、作成するクラスの数が爆発的に増加します。

于 2012-12-25T17:25:41.663 に答える