今回は 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) {...} }