今回は Adapter パターン(一覧)。
Adapter パターンの登場人物
- @Target → 型
- @Adapter → 型
- targetType : Class<?>
- @AdapteeInstance → フィールド
- @Adaptee → 型
- targetType : Class<?>
- @Client → 型
- targetType : Class<?>
@Adaptee の役割をするクラス、インターフェースは、外部ライブラリに含まれているためアノテーションが付加できないという場合もしばしばあるかと思いますが、一応定義しています。
アノテーション定義
上記の定義の具体的な Java コード。
package org.waman.tools.design.gof.structural; import java.lang.annotation.*; import org.waman.tools.design.gof.creational.FactoryMethodPattern; public final class AdapterPattern { private AdapterPattern(){} @java.lang.annotation.Target(ElementType.TYPE) public static @interface Target{} @java.lang.annotation.Target(ElementType.TYPE) public static @interface Adapter { Class<?> targetType() default Void.class; @Inherited @java.lang.annotation.Target(ElementType.FIELD) public static @interface AdapteeInstance{} } @java.lang.annotation.Target(ElementType.TYPE) public static @interface Adaptee{ Class<?> targetType() default Void.class; } @java.lang.annotation.Target(ElementType.TYPE) public static @interface Client{ Class<?> targetType() default Void.class; } }
サンプルコード in 『Java 言語で学ぶデザインパターン入門』
Banner.java
@Adaptee 役のクラス。
import org.waman.tools.design.gof.structural.AdapterPattern; @AdapterPattern.Adaptee(targetType = Print.class) public class Banner { public Banner(String string) {...} public void showWithParen() {...} public void showWithAster() {...} }
Print.java
@Target 役の抽象クラス。
import org.waman.tools.design.gof.structural.AdapterPattern; @AdapterPattern.Target public abstract class Print { public abstract void printWeak(); public abstract void printStrong(); }
PrintBanner.java
@Adapter 役のクラス。 委譲による実現を行っています。
import org.waman.tools.design.gof.structural.AdapterPattern; import org.waman.tools.design.gof.structural.AdapterPattern.Adapter.AdapteeInstance; @AdapterPattern.Adapter(targetType = Print.class) public class PrintBanner extends Print { @AdapteeInstance private Banner banner; @Override public void printWeak() {...} @Override public void printStrong() {...} }
Main.java
@Client 役のクラス。
import org.waman.tools.design.gof.structural.AdapterPattern; @AdapterPattern.Client(targetType = Print.class) public class Main { public static void main(String[] args) { Print p = new PrintBanner("Hello"); p.printWeak(); p.printStrong(); } }