解釋器模式是個不怎麼常用的設計模式。我們先來舉一個簡單的例子說明它。
a+b-c這麼一個表達式,+,-都是非終結符表達式,a,b,c都是終結符表達式。非終結表達式一般是文法中的運算符或者關鍵字,而終結表達式一般是文法中的運算單元。
package interpreter;
import java.util.HashMap;
import java.util.Map;
public class Context {
private final Map<String, Integer> valueMap = new HashMap<String, Integer>();
public void addValue(final String key, final int value) {
valueMap.put(key, Integer.valueOf(value));
}
public int getValue(final String key) {
return valueMap.get(key).intValue();
}
}
package interpreter;
public abstract class AbstractExpression {
public abstract int interpreter(Context context);
}
package interpreter;
public class AddNonterminalExpression extends AbstractExpression {
private final AbstractExpression left;
private final AbstractExpression right;
public AddNonterminalExpression(final AbstractExpression left, final AbstractExpression right) {
this.left = left;
this.right = right;
}
@Override
public int interpreter(final Context context) {
return this.left.interpreter(context) + this.right.interpreter(context);
}
}
package interpreter;
public class SubtractNonterminalExpression extends AbstractExpression {
private final AbstractExpression left;
private final AbstractExpression right;
public SubtractNonterminalExpression(final AbstractExpression left, final AbstractExpression right) {
this.left = left;
this.right = right;
}
@Override
public int interpreter(final Context context) {
return this.left.interpreter(context) - this.right.interpreter(context);
}
}
package interpreter;
public class TerminalExpression extends AbstractExpression {
private final int i;
public TerminalExpression(final int i) {
this.i = i;
}
@Override
public int interpreter(final Context context) {
return this.i;
}
}
package interpreter;
import flyweight.Flyweight;
import flyweight.FlyweightFactory;
import flyweight.UnsharedFlyweight;
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
//a+b-c
final Context context = new Context();
context.addValue("a", 7);
context.addValue("b", 8);
context.addValue("c", 2);
final AddNonterminalExpression addValue = new AddNonterminalExpression
(new TerminalExpression(context.getValue("a")), new TerminalExpression(context.getValue("b")));
final SubtractNonterminalExpression subtractValue = new SubtractNonterminalExpression
(addValue, new TerminalExpression(context.getValue("c")));
System.out.println(subtractValue.interpreter(context));
}
}
解釋器模式的優缺點:解釋器模式的應用場景和注意事項: