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