デコレータ パターンは、既存のオブジェクトに機能を動的に追加できます。以下では、簡単な例を使用して、プログラム内でデコレーター パターンを使用する方法を示します。
1. デコレータパターン
少しの間、あなたがガールフレンドを探していると仮定してみましょう。アメリカ、中国、日本、フランスなど、さまざまな国の女の子がたくさんいます。それぞれが異なる性格や興味を持っています。プログラムでそのような状況をシミュレートする必要がある場合は、それぞれの女の子が自分のことを考えていると仮定してください。 Java クラスの場合、数千のクラスが存在するため、クラスの拡張が発生し、そのような設計のスケーラビリティは比較的低くなります。新しい女の子が必要な場合は、新しい Java クラスを作成する必要がありますが、これはプログラム開発で従う必要がある OCP (拡張にはオープン、変更にはクローズ) 原則に実際に違反するためです。
それぞれの個性や趣味が、女の子の体にダイナミックに追加できる装飾となる別のデザインを作成しましょう。
2. クラス図の構造
3. デコレーターパターンのサンプルコード
Girl.java
次のようにコードをコピーします。
パブリック抽象クラス 女の子 {
文字列の説明 = "特になし";
public String getDescription(){
説明を返します。
}
}
AmericanGirl.java
次のようにコードをコピーします。
public class AmericanGirl extends Girl {
publicAmericanGirl() {
説明 = "+アメリカ人";
}
}
EuropeanGirl.java
次のようにコードをコピーします。
public class EuropeanGirl extends Girl {
public EuropeanGirl(){
説明 = "+ヨーロッパ";
}
}
GirlDecorator.java
次のようにコードをコピーします。
パブリック抽象クラス GirlDecorator extends Girl {
public abstract String getDescription();
}
サイエンス.java
次のようにコードをコピーします。
パブリック クラス Science extends GirlDecorator {
プライベートガールガール。
公共科学(女の子女の子){
this.girl = 女の子;
}
@オーバーライド
public String getDescription() {
return this.girl.getDescription() + "+Like Science";
}
public void caltulateStuff() {
System.out.println("科学計算!");
}
}
Art.java
次のようにコードをコピーします。
パブリック クラス Art は GirlDecorator を拡張します {
プライベートガールガール。
パブリックアート(女の子女の子){
this.girl = 女の子;
}
@オーバーライド
public String getDescription() {
return this.girl.getDescription() + "+いいねアート";
}
public voiddraw() {
System.out.println("絵を描きます!");
}
}
メイン.java
次のようにコードをコピーします。
パブリッククラス Main {
public static void main(String[] args) {
//普通のアメリカ人の女の子
Girl g1 = new AmericanGirl();
System.out.println(g1.getDescription());
//科学が好きな人
サイエンス g2 = 新しいサイエンス(g1);
System.out.println(g2.getDescription());
//アートが好きな方
アート g3 = 新しいアート (g2);
System.out.println(g3.getDescription());
}
}
4. JDKでのデコレータパターンの適用
Java の IO は、デコレータ パターンを使用する最も典型的な例です。
以下は、BufferedReader オブジェクトを通じて InputStreamReader オブジェクトを装飾する簡単な例です。
次のようにコードをコピーします。
BufferedReader 入力 = new BufferedReader(new InputStreamReader(System.in));
//System.in は InputStream オブジェクトです
(全文終わり)