设计模式之---解释器模式

解释器模式是个不怎么常用的设计模式。我们先来举一个简单的例子说明它。

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));
	}
}
解释器模式的优缺点

解释器模式的应用场景和注意事项

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值