デコレータパターン


動的にオブジェクトに追加の責任を付けます.デコレータは、拡張機能のためのサブクラス化に柔軟な代替を提供します.

参加者

  • コンポーネント:動的に追加された責任を持つオブジェクトのインターフェイスを定義します.
  • 具体的には追加の責任を付加できるオブジェクトを定義します.
  • Decorator :コンポーネントオブジェクトへの参照を維持し、コンポーネントのインターフェイスに準拠するインターフェイスを定義します.
  • ConcreteDecorator :コンポーネントに責任を追加します.
  • コード


    public class Main {
    
      public static void main(String[] args) {
        ConcreteComponent c = new ConcreteComponent();
        ConcreteDecoratorA d1 = new ConcreteDecoratorA();
        ConcreteDecoratorB d2 = new ConcreteDecoratorB();
        d1.setComponent(c);
        d2.setComponent(d1);
        d2.operation();
      }
    }
    
    public interface Component {
      void operation();
    }
    
    public class ConcreteComponent implements Component {
    
      @Override
      public void operation() {
        System.out.println("ConcreteComponent.operation()");
      }
    }
    
    public abstract class Decorator implements Component {
    
      protected Component component;
    
      public void setComponent(Component component) {
        this.component = component;
      }
    
      @Override
      public void operation() {
        if (component != null) {
          component.operation();
        }
      }
    }
    
    public class ConcreteDecoratorA extends Decorator {
    
      private static final String ADDED_STATE = "ConcreteDecoratorA.operation()";
    
      @Override
      public void operation() {
        super.operation();
        System.out.println(ADDED_STATE);
      }
    
    }
    
    public class ConcreteDecoratorB extends Decorator {
    
      @Override
      public void operation() {
        super.operation();
        addedBehavior();
        System.out.println("ConcreteDecoratorB.operation()");
      }
    
      private void addedBehavior() {
        System.out.println("ConcreteDecoratorB.addedBehavior()");
      }
    }
    

    出力


    ConcreteComponent.operation()
    ConcreteDecoratorA.operation()
    ConcreteDecoratorB.addedBehavior()
    ConcreteDecoratorB.operation()
    

    エディエルジュリアン61 / デザインパターン