JAvaデザインモード——装飾者モード
名詞の解釈
Decorator Pattern
既存のオブジェクトを変更しない上で、1つのオブジェクトに動的に追加の職責を追加し、継承よりも弾力性のある代替案(既存のオブジェクトを拡張する機能)を提供し、構造型モードに属することを意味します.
適用背景
我々は通常継承を用いて機能の拡張を実現することができ、もしこれらの拡張を必要とする機能の種類が非常に多ければ、必ず多くのサブクラスを生成し、システムの複雑性を増加させると同時に、継承を用いて機能の拡張を実現し、我々はこれらの拡張機能を予見しなければならない.これらの機能は
書き方の例
例えば、ブラシ壁を例にとると、ブラシ壁が軽く2つのステップに分かれていると仮定すると、第1ステップは壁を剃ることであり、第2ステップはブラシ漆であるが、ブラシ漆は人の好みによって異なることはできない.ブラシ漆のステップと回数も異なる.各ブラシ漆案に対して1つのクラスを個別に定義すれば、特に肥大化し、受動的に見える.装飾というモードを変えると、この問題をよく解決することができる.塗装案の制定をユーザー自身に投げ出して選択し、コードは以下の通りである.
まず、基本的な抽象Printerクラス表現ブラシアクションを定義します.
次に、定義およびベースクラスを定義し、基礎的な作業を行います.
装飾者クラスを定義します.
次に、独自のパーソナルペイントスキームを定義できます.
例えば黒塗り
黄色いペンキを塗ることもできます
クライアントが呼び出すとき、ユーザーは自分の好みに応じて、いつ黄色いペンキを塗るか、いつ黒いペンキを塗るか、何回塗るかを自由に選択することができ、このように選択権を完全にユーザー自身に渡すことができます.
実行結果
考える
上のデコレーション者Decoratorは他にもいろいろなことをすることができます.これらのことを加える必要があれば、Decoratorを抽象クラスとして定義し、抽象メソッドを追加することができます.これはテンプレートメソッドのパターンに似ています.もちろん、抽象メソッドを追加せずに、デコレーション者のサブクラスを自分の実際のニーズに合わせて個性的に処理することもできます.
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を抽象クラスとして定義し、抽象メソッドを追加することができます.これはテンプレートメソッドのパターンに似ています.もちろん、抽象メソッドを追加せずに、デコレーション者のサブクラスを自分の実際のニーズに合わせて個性的に処理することもできます.