倭マン's BLOG

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

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

今回は 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();
    }
}

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