JAvaデザインモード——装飾者モード


名詞の解釈
Decorator Pattern
既存のオブジェクトを変更しない上で、1つのオブジェクトに動的に追加の職責を追加し、継承よりも弾力性のある代替案(既存のオブジェクトを拡張する機能)を提供し、構造型モードに属することを意味します.
適用背景
我々は通常継承を用いて機能の拡張を実現することができ、もしこれらの拡張を必要とする機能の種類が非常に多ければ、必ず多くのサブクラスを生成し、システムの複雑性を増加させると同時に、継承を用いて機能の拡張を実現し、我々はこれらの拡張機能を予見しなければならない.これらの機能は で確定し、静的である.装飾者モードを用いることで、加入の仕方やタイミングをユーザによって動的に決定することができる.Decoratorは「プラグ・アンド・プレイ」の方法を提供し、 でいつどのような機能を追加するかを決定する.
書き方の例
例えば、ブラシ壁を例にとると、ブラシ壁が軽く2つのステップに分かれていると仮定すると、第1ステップは壁を剃ることであり、第2ステップはブラシ漆であるが、ブラシ漆は人の好みによって異なることはできない.ブラシ漆のステップと回数も異なる.各ブラシ漆案に対して1つのクラスを個別に定義すれば、特に肥大化し、受動的に見える.装飾というモードを変えると、この問題をよく解決することができる.塗装案の制定をユーザー自身に投げ出して選択し、コードは以下の通りである.
まず、基本的な抽象Printerクラス表現ブラシアクションを定義します.
public abstract class Printer {
    protected abstract String printInfo();
}

次に、定義およびベースクラスを定義し、基礎的な作業を行います.
public class BasePrinter extends Printer {
    @Override
    protected String printInfo() {
        return "   ,      ";
    }
}

装飾者クラスを定義します.
public class Decorator extends Printer { //   Printer
    private Printer printer;  //    Printer    

    public Decorator(Printer printer) {
        this.printer = printer;
    }

    @Override
    public String printInfo() {
        return printer.printInfo(); //                  
    }
}

次に、独自のパーソナルペイントスキームを定義できます.
例えば黒塗り
public class DecoratorBlack extends Decorator {
    public DecoratorBlack(Printer printer) {
        super(printer);
    }    @Override
    public String printInfo() {
        return super.printInfo()+"
======= "
; } }

黄色いペンキを塗ることもできます
public class DecoratorYellow extends Decorator {

    public DecoratorYellow(Printer printer) {
        super(printer);
    }

    @Override
    public String printInfo() {
        return super.printInfo()+"
================= "
; } }

クライアントが呼び出すとき、ユーザーは自分の好みに応じて、いつ黄色いペンキを塗るか、いつ黒いペンキを塗るか、何回塗るかを自由に選択することができ、このように選択権を完全にユーザー自身に渡すことができます.
public class DecoratorPrinterTest {
    public static void main(String[] args) {
        Printer printer = new BasePrinter();
        //  :                  
        printer = new DecoratorBlack(printer);
        printer = new DecoratorYellow(printer);
        printer = new DecoratorBlack(printer);
        printer = new DecoratorYellow(printer);
        
        System.out.println(printer.printInfo());

    }
}

実行結果
   ,      
=======    
=================    
=======    
=================    

考える
上のデコレーション者Decoratorは他にもいろいろなことをすることができます.これらのことを加える必要があれば、Decoratorを抽象クラスとして定義し、抽象メソッドを追加することができます.これはテンプレートメソッドのパターンに似ています.もちろん、抽象メソッドを追加せずに、デコレーション者のサブクラスを自分の実際のニーズに合わせて個性的に処理することもできます.