文档章节

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

合拍
 合拍
发布于 2017/08/21 22:21
字数 910
阅读 3
收藏 0

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

我感觉,解释器模式就是对一段表达式的解释,这个模式分为:表达式类,终结符表达式类,非终结符表达式类,以及运行环境四部分,举个例子:对于表达式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

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

© 著作权归作者所有

合拍
粉丝 1
博文 24
码字总数 20938
作品 0
滨州
程序员
私信 提问
设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
280
0
java 23种设计模式 深入理解

以下是学习过程中查询的资料,别人总结的资料,比较容易理解(站在各位巨人的肩膀上,望博主勿究) 创建型 抽象工厂模式 http://www.cnblogs.com/java-my-life/archive/2012/03/28/2418836.html ...

wc_飞豆
2018/03/16
140
0
设计模式15——Template Method设计模式

Template Method模板方法设计模式定义一个操作中算法的骨架,将具体步骤的执行延迟到子类中实现。Java中的抽象类就是使用了模板方法设计模式。模板方法设计模式结构如下: 以文档处理为例,T...

小米米儿小
2014/01/24
208
0
练就Java24章真经—你所不知道的工厂方法

前言 最近一直在Java方向奋斗《终于,我还是下决心学Java后台了》,今天抽空开始学习Java的设计模式了 。计划有时间就去学习,你这么有时间,还不来一起上车吗? 之所以要学习Java模式,是因...

codeGoogle
2018/10/30
0
0
Java之23种设计模式解析(一)

一、设计模式概述 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模...

wersdffg
2015/02/15
301
0

没有更多内容

加载失败,请刷新页面

加载更多

Qt程序打包发布方法(使用官方提供的windeployqt工具)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/toTheUnknown/article/details/81748179 如果使用到了Qt ...

shzwork
21分钟前
2
0
MainThreadSupport

MainThreadSupport EventBus 3.0 中的代码片段. org.greenrobot.eventbus.MainThreadSupport 定义一个接口,并给出默认实现类. 调用者可以在EventBus的构建者中替换该实现. public interface ...

马湖村第九后羿
42分钟前
3
0
指定要使用的形状来代替文字的显示

控制手机键盘弹出的功能只能在ios上实现,安卓是实现不了的,所以安卓只能使用type类型来控制键盘类型,例如你要弹出数字键盘就使用type="number",如果要弹出电话键盘就使用type="tel",但这...

前端老手
52分钟前
6
0
总结:Raft协议

一、Raft协议是什么? 分布式一致性算法。即解决分布式系统中各个副本数据一致性问题。 二、Raft的日志广播过程 发送日志到所有Followers(Raft中将非Leader节点称为Follower)。 Followers收...

浮躁的码农
59分钟前
7
0
Flask-admin Model View字段介绍

Model View字段介绍 can_create = True 是否可以创建can_edit = True 是否可以编辑can_delete = True 是否可以删除list_template = 'admin/model/list.html' 修改显......

dillonxiao
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部