装饰者パターンとは
装饰者パターンは、 объекに動的に追加の职责を付与するものであり、功能的增加において、サブクラス生成よりも柔軟な解決策を提供します。
実践的なシナリオ
人の服飾打扮を通じて装饰者パターンを説明します。
基本クラス(装飾される側)
/**
* 装飾される人間クラス
*/
public class Human {
private String name;
public Human(String name) {
this.name = name;
}
public Human() {
}
public void display() {
System.out.println(MessageFormat.format("{0}のコーディネート", this.name));
}
}
装飾基底クラス
/**
* 装飾品基底クラス
*/
public class Accessory extends Human {
protected Human wrappedPerson;
public void dress(Human person) {
this.wrappedPerson = person;
}
@Override
public void display() {
if (this.wrappedPerson != null) {
this.wrappedPerson.display();
}
}
}
具体的な装飾品クラス
/**
* カジュアルウェアクラス
*/
public class CasualWear extends Accessory {
@Override
public void display() {
System.out.println("カジュアルウェア ");
super.display();
}
}
/**
* ワイドパンツクラス
*/
public class WidePants extends Accessory {
@Override
public void display() {
System.out.println("ワイドパンツ ");
super.display();
}
}
/**
* スニーカークラス
*/
public class Sneakers extends Accessory {
@Override
public void display() {
System.out.println("スニーカー ");
super.display();
}
}
使用例
/**
* 装饰者パターン・デモ
*/
public class DecoratorPatternDemo {
public static void main(String[] args) {
Human person = new Human("太郎");
System.out.println("コーディネート内容: ");
CasualWear casualWear = new CasualWear();
WidePants widePants = new WidePants();
Sneakers sneakers = new Sneakers();
casualWear.dress(person);
widePants.dress(casualWear);
sneakers.dress(widePants);
sneakers.display();
}
}
実行結果
コーディネート内容:
スニーカー
ワイドパンツ
カジュアルウェア
太郎のコーディネート
パターンの解析
- 連鎖の重要性: 必要な機能を正しい順序で連結し、制御する必要があります。
- 動的な機能追加: 装饰者パターンは、既存の功能に動的に新機能を追加する手法です。
- 拡張と分離: 新規機能的需求に応じて、旧クラスにコードを追加するのではなく、装饰者を使用して拡張を行います。新しく追加されたコードは元のクラスの主要な职责を装飾するため、主要な职责と装飾のconcernsを明確に分離できます。
- 複雑性の回避: 主クラスに新しいフィールド、メソッド、ロジックを追加すると、クラスの複雑さが増大します。特に、特定の条件下でのみ実行される特殊动作のために這い寄せられるのは推奨されません。装饰者パターンは、この问题への優れた解决方案を提供します。各装飾機能を个別のクラスに配置し、そのクラスで装飾対象のオブジェクトをラップします。これにより、客户端では実行時に需求に応じて選択的に装飾功能を適用できます。
- 主なメリット: 装饰機能を元のクラスから分離することで、 클래스가 단순화되고、核心职责と装飾機能职责が明確に区別されます。また、相关クラスにおける重複した装飾ロジックを排除できます。