デコレータモード(デコレータ)
追加の責任をオブジェクトに動的に追加します。デコレータは、機能を追加するという点でサブクラス化よりも柔軟です。
該当シーン
- 他のオブジェクトに影響を与えることなく、動的かつ透過的に個々のオブジェクトに責任を追加します。
- 取り消される可能性のある責任を処理します。
- サブクラス生成による拡張ができない場合。場合によっては、多数の独立した拡張があり、それぞれの組み合わせをサポートするために多数のサブクラスが生成され、サブクラスの数が爆発的に増加することがあります。別の状況として、クラス定義が非表示になっているか、サブクラスの生成に使用できないことが考えられます。
✦ コンポーネントは、これらのオブジェクトに責任を動的に追加できるオブジェクト インターフェイスを定義します。
✦ ConcreteComponent は、いくつかの責任を追加できるオブジェクトを定義します。
✦ Decorator は、Component オブジェクトへのポインタを維持し、Component インターフェースと一致するインターフェースを定義します。
✦ ConcreteDecorator はコンポーネントに責任を追加します。
装飾パターンサンプルコード(Java)
//对应Component
abstract class Person {
protected String name;
public abstract void Operation(); // 职责
}
//对应ConcreteComponent
class Student extends Person {
public Student(String name) {
this.name = name;
}
@Override
public void Operation() {
System.out.print(name + "的职责:学习 ");
}
}
abstract class Decorator extends Person {
//Decorator维持一个指向Component对象的指针
protected Person person;
}
//对应ConcreteDecorator
class DecoratorA extends Decorator {
public DecoratorA(Person person) {
this.person = person;
}
@Override
public void Operation() {
// 职责
person.Operation(); // 原本的职责
System.out.print("写作业 ");
}
}
//对应ConcreteDecorator
class DecoratorB extends Decorator {
public DecoratorB(Person person) {
this.person = person;
}
@Override
public void Operation() {
// 职责
person.Operation(); // 原本的职责
System.out.print("考试 ");
}
}
public class DecoratorMain {
public static void main(String[] args) {
Person zhangsan = new Student("zhangsan");
zhangsan = new DecoratorA(zhangsan);
zhangsan = new DecoratorB(zhangsan);
zhangsan.Operation();
System.out.println("\n=====我是分割线=====");
// 对象链,一次性将职责添加完
Person lisi = new DecoratorB(new DecoratorA(new Student("lisi")));
lisi.Operation();
}
}
他のデザインパターンについては、このコラムの他のブログ投稿を参照してください~
ブロガー B ステーションzst_2001
の個人スペースに投稿された、ソフト試験準備期間中に助けてくれた zst_2001 に感謝します。