倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

「GoF デザインパターン」アノテーション (9) : Decorator パターン

今回は Decorator パターン一覧)。

Decorator パターンの登場人物

  • @Component → 型
  • @CreateComponent → 具象クラス
    • componentType : Class<?>
  • @Decorator → 型
    • componentType : Class<?>
    • @ComponentInstance → フィールド
  • @ConcreteDecorator → 具象クラス
    • decoratorType : Class<?>

アノテーション定義


上記の定義の具体的な Java コード。

package orpackage org.waman.tools.design.gof.structural;

import java.lang.annotation.*;

public final class DecoratorPattern {
    
    private DecoratorPattern(){}

    @Target(ElementType.TYPE)
    public static @interface Component{}

    @Target(ElementType.TYPE)
    public static @interface ConcreteComponent{
        Class<?> componentType() default Void.class;
    }

    @Target(ElementType.TYPE)
    public static @interface Decorator{

        Class<?> componentType() default Void.class;

        @Inherited @Target(ElementType.FIELD)
        public static @interface ComponentInstance{}
    }

    @Target(ElementType.TYPE)
    public static @interface ConcreteDecorator{
        Class<?> decoratorType() default Void.class;
    }
}

サンプルコード in 『Java 言語で学ぶデザインパターン入門』


Display.java

@Component 役のクラス。

import org.waman.tools.design.gof.structural.DecoratorPattern;

@DecoratorPattern.Component
public abstract class Display {
    public abstract int getColumns();
    public abstract int getRows();
    public abstract String getRowText(int row);
    public void show() {...}
}

StringDisplay.java

@ConcreteComponent 役のクラス。

import org.waman.tools.design.gof.structural.DecoratorPattern;

@DecoratorPattern.ConcreteComponent(componentType = Display.class)
public class StringDisplay extends Display {
    ...
    @Override public int getColumns() {...}
    @Override public int getRows() {...}
    @Override public String getRowText(int row) {...}
}

Border.java

@Decorator 役のクラス。

import org.waman.tools.design.gof.structural.DecoratorPattern;
import org.waman.tools.design.gof.structural.DecoratorPattern.Decorator.ComponentInstance;

@DecoratorPattern.Decorator(componentType = Display.class)
public abstract class Border extends Display {
    
    @ComponentInstance protected Display display;
    
    protected Border(Display display) {
        this.display = display;
    }
}

FullBorder.java

import org.waman.tools.design.gof.structural.DecoratorPattern;

@DecoratorPattern.ConcreteDecorator(decoratorType = Border.class)
public class FullBorder extends Border {
    ...
    @Override public int getColumns() {...}
    @Override public int getRows() {...}
    @Override public String getRowText(int row) {...}
}

増補改訂版Java言語で学ぶデザインパターン入門 オブジェクト指向における再利用のためのデザインパターン