[構造体タイプ] デコレータモード(Decorator)

デコレータモード(デコレータ)

追加の責任をオブジェクトに動的に追加します。デコレータは、機能を追加するという点でサブクラス化よりも柔軟です。

該当シーン

  • 他のオブジェクトに影響を与えることなく、動的かつ透過的に個々のオブジェクトに責任を追加します。
  • 取り消される可能性のある責任を処理します。
  • サブクラス生成による拡張ができない場合。場合によっては、多数の独立した拡張があり、それぞれの組み合わせをサポートするために多数のサブクラスが生成され、サブクラスの数が爆発的に増加することがあります。別の状況として、クラス定義が非表示になっているか、サブクラスの生成に使用できないことが考えられます。

ここに画像の説明を挿入
✦ コンポーネントは、これらのオブジェクトに責任を動的に追加できるオブジェクト インターフェイスを定義します。
✦ 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 に感謝します。

おすすめ

転載: blog.csdn.net/qq_44033208/article/details/128479471