倭マン's BLOG

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

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

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

Interpreter パターンの登場人物

  • @Context → 型
    • expressionType : Class<?>
  • @AbstractExpression → 型
    • @Interpret → メソッド
  • @TerminalExpression → 型
    • expressionType : Class<?>
  • @NonterminalExpression → 型
    • expressionType : Class<?>
    • @ChildExpressions → フィールド
  • @Client → 型
    • expressionType : Class<?>

アノテーション定義


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

package org.waman.tools.design.gof.behavioral;

import java.lang.annotation.*;

public final class InterpreterPattern {
    
    private InterpreterPattern(){}

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

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

        @Inherited @Target(ElementType.METHOD)
        public static @interface Interpret{}
    }

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

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

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

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

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

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


Node.java

@AbstractExpression 役のクラス。

import org.waman.tools.design.gof.behavioral.InterpreterPattern;
import org.waman.tools.design.gof.behavioral.InterpreterPattern.AbstractExpression.Interpret;

@InterpreterPattern.AbstractExpression
public abstract class Node {
    @Interpret public abstract void parse(Context context) throws ParseException;
}

Context.java

@Context 役のクラス。

import org.waman.tools.design.gof.behavioral.InterpreterPattern;

@InterpreterPattern.Context(expressionType = Node.class)
public class Context {
    ...
}

PrimitiveCommandNode.java, CommandListNode.java

import org.waman.tools.design.gof.behavioral.InterpreterPattern;

@InterpreterPattern.TerminalExpression(expressionType = Node.class)
public class PrimitiveCommandNode extends Node {
    ...
    @Override public void parse(Context context) throws ParseException {...}
}
import org.waman.tools.design.gof.behavioral.InterpreterPattern;
import org.waman.tools.design.gof.behavioral.InterpreterPattern.NonterminalExpression.ChildExpressions;

@InterpreterPattern.NonterminalExpression(expressionType = Node.class)
public class CommandListNode extends Node {
    
    @ChildExpressions private final List<Node> list = new ArrayList<Node>();
    
    @Override public void parse(Context context) throws ParseException {...}
    ...
}

Main.java

@InterpreterPattern.Client(expressionType = Node.class)
public class Main {
    public static void main(String[] args) {...}
}

増補改訂版Java言語で学ぶデザインパターン入門 オブジェクト指向における再利用のためのデザインパターン Code Complete第2版〈上〉―完全なプログラミングを目指して Code Complete第2版〈下〉―完全なプログラミングを目指して