解释器模式Interpreter详解
原文链接:https://www.cnblogs.com/java-my-life/archive/2012/06/19/2552617.html
在阎宏博士的《JAVA与模式》一书中开头是这样描述解释器(Interpreter)模式的:
解释器模式是类的行为模式。给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。
解释器模式的结构
下面就以一个示意性的系统为例,讨论解释器模式的结构。系统的结构图如下所示:
aaarticlea/png;base64,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" alt="" />
模式所涉及的角色如下所示:
(1)抽象表达式(Expression)角色:声明一个所有的具体表达式角色都需要实现的抽象接口。这个接口主要是一个interpret()方法,称做解释操作。
(2)终结符表达式(Terminal Expression)角色:实现了抽象表达式角色所要求的接口,主要是一个interpret()方法;文法中的每一个终结符都有一个具体终结表达式与之相对应。比如有一个简单的公式R=R1+R2,在里面R1和R2就是终结符,对应的解析R1和R2的解释器就是终结符表达式。
(3)非终结符表达式(Nonterminal Expression)角色:文法中的每一条规则都需要一个具体的非终结符表达式,非终结符表达式一般是文法中的运算符或者其他关键字,比如公式R=R1+R2中,“+"就是非终结符,解析“+”的解释器就是一个非终结符表达式。
(4)环境(Context)角色:这个角色的任务一般是用来存放文法中各个终结符所对应的具体值,比如R=R1+R2,我们给R1赋值100,给R2赋值200。这些信息需要存放到环境角色中,很多情况下我们使用Map来充当环境角色就足够了。
为了说明解释器模式的实现办法,这里给出一个最简单的文法和对应的解释器模式的实现,这就是模拟Java语言中对布尔表达式进行操作和求值。
在这个语言中终结符是布尔变量,也就是常量true和false。非终结符表达式包含运算符and,or和not等布尔表达式。这个简单的文法如下:
Expression ::= Constant | Variable | Or | And | Not
And ::= Expression 'AND' Expression
Or ::= Expression 'OR' Expression
Not ::= 'NOT' Expression
Variable ::= 任何标识符
Constant ::= 'true' | 'false'
解释器模式的结构图如下所示:
aaarticlea/png;base64,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" alt="" />
源代码
抽象表达式角色
public abstract class Expression {
/**
* 以环境为准,本方法解释给定的任何一个表达式
*/
public abstract boolean interpret(Context ctx);
/**
* 检验两个表达式在结构上是否相同
*/
public abstract boolean equals(Object obj);
/**
* 返回表达式的hash code
*/
public abstract int hashCode();
/**
* 将表达式转换成字符串
*/
public abstract String toString();
}
一个Constant对象代表一个布尔常量
public class Constant extends Expression{ private boolean value; public Constant(boolean value){
this.value = value;
} @Override
public boolean equals(Object obj) { if(obj != null && obj instanceof Constant){
return this.value == ((Constant)obj).value;
}
return false;
} @Override
public int hashCode() {
return this.toString().hashCode();
} @Override
public boolean interpret(Context ctx) { return value;
} @Override
public String toString() {
return new Boolean(value).toString();
} }
一个Variable对象代表一个有名变量
public class Variable extends Expression { private String name; public Variable(String name){
this.name = name;
}
@Override
public boolean equals(Object obj) { if(obj != null && obj instanceof Variable)
{
return this.name.equals(
((Variable)obj).name);
}
return false;
} @Override
public int hashCode() {
return this.toString().hashCode();
} @Override
public String toString() {
return name;
} @Override
public boolean interpret(Context ctx) {
return ctx.lookup(this);
} }
代表逻辑“与”操作的And类,表示由两个布尔表达式通过逻辑“与”操作给出一个新的布尔表达式的操作
public class And extends Expression { private Expression left,right; public And(Expression left , Expression right){
this.left = left;
this.right = right;
}
@Override
public boolean equals(Object obj) {
if(obj != null && obj instanceof And)
{
return left.equals(((And)obj).left) &&
right.equals(((And)obj).right);
}
return false;
} @Override
public int hashCode() {
return this.toString().hashCode();
} @Override
public boolean interpret(Context ctx) { return left.interpret(ctx) && right.interpret(ctx);
} @Override
public String toString() {
return "(" + left.toString() + " AND " + right.toString() + ")";
} }
代表逻辑“或”操作的Or类,代表由两个布尔表达式通过逻辑“或”操作给出一个新的布尔表达式的操作
public class Or extends Expression {
private Expression left,right; public Or(Expression left , Expression right){
this.left = left;
this.right = right;
}
@Override
public boolean equals(Object obj) {
if(obj != null && obj instanceof Or)
{
return this.left.equals(((Or)obj).left) && this.right.equals(((Or)obj).right);
}
return false;
} @Override
public int hashCode() {
return this.toString().hashCode();
} @Override
public boolean interpret(Context ctx) {
return left.interpret(ctx) || right.interpret(ctx);
} @Override
public String toString() {
return "(" + left.toString() + " OR " + right.toString() + ")";
} }
代表逻辑“非”操作的Not类,代表由一个布尔表达式通过逻辑“非”操作给出一个新的布尔表达式的操作
public class Not extends Expression { private Expression exp; public Not(Expression exp){
this.exp = exp;
}
@Override
public boolean equals(Object obj) {
if(obj != null && obj instanceof Not)
{
return exp.equals(
((Not)obj).exp);
}
return false;
} @Override
public int hashCode() {
return this.toString().hashCode();
} @Override
public boolean interpret(Context ctx) {
return !exp.interpret(ctx);
} @Override
public String toString() {
return "(Not " + exp.toString() + ")";
} }
环境(Context)类定义出从变量到布尔值的一个映射
public class Context { private Map<Variable,Boolean> map = new HashMap<Variable,Boolean>(); public void assign(Variable var , boolean value){
map.put(var, new Boolean(value));
} public boolean lookup(Variable var) throws IllegalArgumentException{
Boolean value = map.get(var);
if(value == null){
throw new IllegalArgumentException();
}
return value.booleanValue();
}
}
客户端类
public class Client { public static void main(String[] args) {
Context ctx = new Context();
Variable x = new Variable("x");
Variable y = new Variable("y");
Constant c = new Constant(true);
ctx.assign(x, false);
ctx.assign(y, true); Expression exp = new Or(new And(c,x) , new And(y,new Not(x)));
System.out.println("x=" + x.interpret(ctx));
System.out.println("y=" + y.interpret(ctx));
System.out.println(exp.toString() + "=" + exp.interpret(ctx));
} }
运行结果如下:aaarticlea/png;base64,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" alt="" />
解释器模式Interpreter详解的更多相关文章
- Java多线程编程中Future模式的详解
Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...
- 乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern)
原文:乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern) 作 ...
- 解释器模式 Interpreter 行为型 设计模式(十九)
解释器模式(Interpreter) 考虑上图中计算器的例子 设计可以用于计算加减运算(简单起见,省略乘除),你会怎么做? 你可能会定义一个工具类,工具类中有N多静态方法 比如定义了两个 ...
- Java多线程编程中Future模式的详解<转>
Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...
- 二十四种设计模式:解释器模式(Interpreter Pattern)
解释器模式(Interpreter Pattern) 介绍给定一个语言, 定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子. 示例有一个Message实体类,某个类对它的 ...
- Atitit.设计模式-----触发器模式 trigger 详解
Atitit.设计模式-----触发器模式 trigger 详解 1. 触发器概念1 1.1. 触发器位置 after|before|instead of1 2. 数据库里面的触发器1 2.1. o ...
- C#设计模式:解释器模式(Interpreter Pattern)
一,C#设计模式:解释器模式(Interpreter Pattern) 1,解释器模式的应用场合是Interpreter模式应用中的难点,只有满足“业务规则频繁变化,且类似的模式不断重复出现,并且容易 ...
- 设计模式之解释器模式(Interpreter)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- [设计模式] 15 解释器模式 Interpreter
在GOF的<设计模式:可复用面向对象软件的基础>一书中对解释器模式是这样说的:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子.如果一种特定类 ...
随机推荐
- Java-API:java.util.regex.Pattern
ylbtech-Java-API:java.util.regex.Pattern 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 1. https://docs. ...
- Mysql 5.6 MHA (gtid) on Kylin
mha on Kylinip hostname repl role mha role192.168.19.69 mysql1 master node192.168.19.73 mysql2 slave ...
- 转:MongoDB · 引擎特性 · journal 与 oplog,究竟谁先写入?
转:MongoDB · 引擎特性 · journal 与 oplog,究竟谁先写入? 数据库内核月报 链接:http://mysql.taobao.org/monthly/2018/05/07/ Mo ...
- DataGridView上下方向键定位
/// <summary> /// DataGridView上下方向键定位 /// </summary> /// <param name="dgv"& ...
- DAY5-常用模块
一 time与datetime模块 二.random模块 三.os模块 四.sys模块 五 shutil模块 六 json&pickle模块 七 shelve模块 八 xml模块 九 conf ...
- CentOS6.5 安装ORACLE 安装界面乱码解决方案
在终端运行 export LANG=EN_US 然后再执行安装程序
- hibernate的子查询
hibernate原话 HQL supports subqueries in the where clause. We can't think of many good uses for subque ...
- C语言-郝斌笔记-001求二次方程的根
求二次方程的根 #include <stdio.h > #include<math.h> int main(void) { //把三个系数保存到计算机中 ; //=不表示相等, ...
- fibnacci数列的两种实现(递归实现和循环实现)
//一切尽在规律中,认真观察,你会明白更多... using System;using System.Collections.Generic;using System.Linq;using Syste ...
- 炫酷实用的CSS3代码垂直手风琴菜单
今天在微博上看到别人分享的代码,自己拿来自己保存着. 代码效果如下: 下面是源码: index.html <!DOCTYPE html> <html > <head> ...