java设计模式(十五)--解释器模式

原创
2017/08/21 22:21
阅读数 3

对于解释器模式,我看了网络上的各种解释,但是真的是理解不了,但是为了和大家分享一下我对这个模式的理解,然后我看了很的博客对这个模式的讲解,看了三四篇代码后终于是理解了。

我感觉,解释器模式就是对一段表达式的解释,这个模式分为:表达式类,终结符表达式类,非终结符表达式类,以及运行环境四部分,举个例子:对于表达式a=b+c来说,表达式就是a=b+c,终结符表达式就是b和c,非终结符表达式就是运算符(+),运行环境就是为终结运算符赋值,那么,我们要做的就是用这四个部分将一个表达式赋上值后进行解释。

这坨白话文就是我对这个模式的理解了,接下来我们看一下网络上的抽象的不能再抽象的解释吧:

此模式提供了评估语言的语法或表达式的方式,这种模式实现了一个表达式接口,该接口解释一个特定的上下文。此模式给定一个语言,定义他的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。

实例:用解释器模式来解释某个表达式。 以下是我对此实例所画的类图:

输入图片说明

以下是我对此实例所编写的代码:

1.编写抽象表达式类

//表达式
public abstract class Expression {
	//参数的名称
	private String name;
	
	public Expression(String name) {
		this.name = name;
	}
	abstract int interpret(Context context);
	@Override
	public int hashCode() {
		// TODO Auto-generated method stub
		return this.name.hashCode()*31;
	}
	@Override
	public boolean equals(Object obj) {
		if(obj==null){
			return false;
		}
		if(obj==this){
			return true;
		}
		if(obj instanceof Expression){
			Expression e=(Expression) obj;
			return e.name.equals(this.name);
		}
		return false;
	}
}

2.编写终结表达式类(设置表达式中的变量)

//终结符表达式
public class TerminalExpression extends Expression {
	public TerminalExpression(String name) {
		super(name);
	}

	@Override
	int interpret(Context context) {
		// TODO Auto-generated method stub
		return context.getKey(this);
	}
}

3.编写运行环境(为终结表达式赋值)

//运行环境,用于给参数赋值
public class Context {
	private static Map<Expression,Integer> maps=new HashMap<Expression,Integer>();
	void addition(Expression e,int value){
		maps.put(e, value);
	}
	int getKey(Expression e){
		Object o=maps.get(e);
		if(o==null){
			return 0;
		}
		return (int) o;
	}
}

4.编写非终结符表达式类(根据四则运算符来运行四则运算)

//非终结符表达式(加法)
public class AddExpression extends Expression {
	private Expression e1=null;
	private Expression e2=null;

	public AddExpression(String name, Expression e1, Expression e2) {
		super(name);
		this.e1 = e1;
		this.e2 = e2;
	}
	@Override
	int interpret(Context context) {
		// TODO Auto-generated method stub
		return e1.interpret(context)+e2.interpret(context);
	}
}

//非终结符表达式(减法)
public class SubExpression extends Expression {
	private Expression e1=null;
	private Expression e2=null;

	public SubExpression(String name, Expression e1, Expression e2) {
		super(name);
		this.e1 = e1;
		this.e2 = e2;
	}
	@Override
	int interpret(Context context) {
		// TODO Auto-generated method stub
		return e1.interpret(context)-e2.interpret(context);
	}
}

5.编写测试类

public class Test {
	public static void main(String[] args) {
		Context ctx=new Context();
		TerminalExpression te1=new TerminalExpression("a");
		TerminalExpression te2=new TerminalExpression("b");
		TerminalExpression te3=new TerminalExpression("c");
		TerminalExpression te4=new TerminalExpression("d");
		ctx.addition(te1, 45);
		ctx.addition(te2, 12);
		ctx.addition(te3, 34);
		ctx.addition(te4, 23);
		
		AddExpression add=new AddExpression("+", te1, te2);
		int end=add.interpret(ctx);
		System.out.println(String.format("%d+%d=%d",ctx.getKey(te1),ctx.getKey(te1),end));
		
		SubExpression sub=new SubExpression("-", te2, te4);
		
		end=sub.interpret(ctx);
		System.out.println(String.format("%d+%d=%d",ctx.getKey(te2),ctx.getKey(te4),end));
	}
}

6.后台运行

45+45=57
12+23=-11

以上就是用解释器完成的对指 定表达式的解释,总结一句话:这模式就是用来解释表达式的,通过解释表达式中的每个变量并赋上值,然后完成对有值表达式的计算。 自我感觉,这个模式一般不会用到,大家理解就好。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部