前言:【模式总览】——————————by xingoo

  模式意图

  自定义某种语言后,给定一种文法标准,定义解释器,进行解析。

  做过搜索的朋友们可能更了解一些,平时我们搜索所需要的词库,通常就需要用这种方式来实现。

  应用场景

  1 有复杂的语法分析场景

  2 需要高效的解释,胜过快速的效率(即看中解释的结果,而放弃效率)

  模式结构

  Expression 语法解释器的抽线模型

/**
* 指定抽象表达式,具体表达式必须实现的方法
* @author xingoo
*
*/
abstract class Expression{
/**
* 以上下文环境为准,解释指定的表达式
* @param ctx
* @return
*/
public abstract boolean interpret(Context ctx);
/**
* 检验两个表达式,是否相同
*/
public abstract boolean equals(Object o);
/**
* 返回表达式代表的hashCode
*/
public abstract int hashCode();
/**
* 转换成字符串
*/
public abstract String toString();
}

  以下是具体的解释器实现过程,这里主要模仿JAVA模式中的例子

/**
* 常量表达式
* @author xingoo
*
*/
class Constant extends Expression{
private boolean value;
public Constant(boolean value){
this.value = value;
}
public boolean interpret(Context ctx){
return value;
}
public boolean equals(Object o){
if(o!=null && o instanceof Constant){
return this.value == ((Constant)o).value;
}
return false;
}
public int hashCode() {
return (this.toString()).hashCode();
}
public String toString() {
return new Boolean(value).toString();
}
}
/**
* 变量表达式
* @author xingoo
*
*/
class Variable extends Expression{
private String name; public Variable(String name){
this.name = name;
} public boolean interpret(Context ctx) {
return ctx.lookup(this);
} public boolean equals(Object o) {
if(o!=null && o instanceof Variable){
return this.name.equals(((Variable)o).name);
}
return false;
} public int hashCode() {
return (this.toString()).hashCode();
}
public String toString() {
return name;
} }
/**
* 与 表达式
* @author xingoo
*
*/
class And extends Expression{
private Expression left,right; public And(Expression left,Expression right){
this.left = left;
this.right = right;
} public boolean interpret(Context ctx) {
return left.interpret(ctx) && right.interpret(ctx);
} @Override
public boolean equals(Object o) {
if(o!=null && o instanceof And){
return this.left.equals(((And)o).left) && this.right.equals(((And)o).right);
}
return false;
} public int hashCode() {
return (this.toString()).hashCode();
} public String toString() {
return "("+left.toString()+" AND "+right.toString()+")";
}
}
/**
* 或 表达式
* @author xingoo
*
*/
class Or extends Expression{
private Expression left,right; public Or(Expression left,Expression right){
this.left = left;
this.right = right;
} public boolean interpret(Context ctx) {
return left.interpret(ctx) || right.interpret(ctx);
} public boolean equals(Object o) {
if(o!=null && o instanceof Or){
return this.left.equals(((Or)o).left) && this.right.equals(((Or)o).right);
}
return false;
} public int hashCode() {
return (this.toString()).hashCode();
} public String toString() {
return "("+left.toString()+" Or "+right.toString()+")";
}
}
/**
* 非 表达式
* @author xingoo
*
*/
class Not extends Expression{
private Expression exp; public Not(Expression exp){
this.exp = exp;
} public boolean interpret(Context ctx) {
return !exp.interpret(ctx);
} public boolean equals(Object o) {
if(o!=null && o instanceof Not){
return this.exp.equals(((Not)o).exp);
}
return false;
} public int hashCode() {
return (this.toString()).hashCode();
} public String toString() {
return "(Not "+exp.toString()+")";
} }

  Context 上下文环境,存储一些表达式的内容

/**
* 上下文环境
* @author xingoo
*
*/
class Context{ private HashMap map = new HashMap(); public void assign(Variable var,boolean value){
map.put(var, new Boolean(value));
} public boolean lookup(Variable var) throws IllegalArgumentException{
Boolean value = (Boolean)map.get(var);
if(value == null){
throw new IllegalArgumentException();
}
return value.booleanValue();
}
}

  全部代码

 package com.xingoo.interpreter;

 import java.util.HashMap;
/**
* 指定抽象表达式,具体表达式必须实现的方法
* @author xingoo
*
*/
abstract class Expression{
/**
* 以上下文环境为准,解释指定的表达式
* @param ctx
* @return
*/
public abstract boolean interpret(Context ctx);
/**
* 检验两个表达式,是否相同
*/
public abstract boolean equals(Object o);
/**
* 返回表达式代表的hashCode
*/
public abstract int hashCode();
/**
* 转换成字符串
*/
public abstract String toString();
}
/**
* 常量表达式
* @author xingoo
*
*/
class Constant extends Expression{
private boolean value;
public Constant(boolean value){
this.value = value;
}
public boolean interpret(Context ctx){
return value;
}
public boolean equals(Object o){
if(o!=null && o instanceof Constant){
return this.value == ((Constant)o).value;
}
return false;
}
public int hashCode() {
return (this.toString()).hashCode();
}
public String toString() {
return new Boolean(value).toString();
}
}
/**
* 变量表达式
* @author xingoo
*
*/
class Variable extends Expression{
private String name; public Variable(String name){
this.name = name;
} public boolean interpret(Context ctx) {
return ctx.lookup(this);
} public boolean equals(Object o) {
if(o!=null && o instanceof Variable){
return this.name.equals(((Variable)o).name);
}
return false;
} public int hashCode() {
return (this.toString()).hashCode();
}
public String toString() {
return name;
} }
/**
* 与 表达式
* @author xingoo
*
*/
class And extends Expression{
private Expression left,right; public And(Expression left,Expression right){
this.left = left;
this.right = right;
} public boolean interpret(Context ctx) {
return left.interpret(ctx) && right.interpret(ctx);
} @Override
public boolean equals(Object o) {
if(o!=null && o instanceof And){
return this.left.equals(((And)o).left) && this.right.equals(((And)o).right);
}
return false;
} public int hashCode() {
return (this.toString()).hashCode();
} public String toString() {
return "("+left.toString()+" AND "+right.toString()+")";
}
}
/**
* 或 表达式
* @author xingoo
*
*/
class Or extends Expression{
private Expression left,right; public Or(Expression left,Expression right){
this.left = left;
this.right = right;
} public boolean interpret(Context ctx) {
return left.interpret(ctx) || right.interpret(ctx);
} public boolean equals(Object o) {
if(o!=null && o instanceof Or){
return this.left.equals(((Or)o).left) && this.right.equals(((Or)o).right);
}
return false;
} public int hashCode() {
return (this.toString()).hashCode();
} public String toString() {
return "("+left.toString()+" Or "+right.toString()+")";
}
}
/**
* 非 表达式
* @author xingoo
*
*/
class Not extends Expression{
private Expression exp; public Not(Expression exp){
this.exp = exp;
} public boolean interpret(Context ctx) {
return !exp.interpret(ctx);
} public boolean equals(Object o) {
if(o!=null && o instanceof Not){
return this.exp.equals(((Not)o).exp);
}
return false;
} public int hashCode() {
return (this.toString()).hashCode();
} public String toString() {
return "(Not "+exp.toString()+")";
} }
/**
* 上下文环境
* @author xingoo
*
*/
class Context{ private HashMap map = new HashMap(); public void assign(Variable var,boolean value){
map.put(var, new Boolean(value));
} public boolean lookup(Variable var) throws IllegalArgumentException{
Boolean value = (Boolean)map.get(var);
if(value == null){
throw new IllegalArgumentException();
}
return value.booleanValue();
}
}
public class Client {
private static Context ctx;
private static Expression exp;
public static void main(String[] args) {
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); 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));
}
}

  运行结果

x = false
y = true
((true AND x) Or (y AND (Not x))) = true

【设计模式】—— 解释器模式Interpret的更多相关文章

  1. Java设计模式----解释器模式

    计算器中,我们输入“20 + 10 - 5”,计算器会得出结果25并返回给我们.可你有没有想过计算器是怎样完成四则运算的?或者说,计算器是怎样识别你输入的这串字符串信息,并加以解析,然后执行之,得出结 ...

  2. JAVA 设计模式 解释器模式

    用途 解释器模式 (Interpreter) 定义一个语言,定义它的文法的一种表示. 并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 解释器模式是一种行为型模式. 结构

  3. 深入浅出设计模式——解释器模式(Interpreter Pattern)

    模式动机 如果在系统中某一特定类型的问题发生的频率很高,此时可以考虑将这些问题的实例表述为一个语言中的句子,因此可以构建一个解释器,该解释器通过解释这些句子来解决这些问题.解释器模式描述了如何构成一个 ...

  4. 设计模式 -- 解释器模式(Interpreter Pattern)

    2015年12月15日00:19:02 今天只看了理论和demo,明天再写文章,跑步好累 2015年12月15日21:36:00 解释器模式用来解释预先定义的文法. <大话设计模式>里面这 ...

  5. C++设计模式——解释器模式

    解释器模式 在GOF的<设计模式:可复用面向对象软件的基础>一书中对解释器模式是这样说的:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子.如 ...

  6. [工作中的设计模式]解释器模式模式Interpreter

    一.模式解析 解释器模式是类的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器.客户端可以使用这个解释器来解释这个语言中的句子. 以上是解释器模式的类图,事实上我 ...

  7. C#设计模式——解释器模式(Interpreter Pattern)

    一.概述 在软件开发特别是DSL开发中常常需要使用一些相对较复杂的业务语言,如果业务语言使用频率足够高,且使用普通的编程模式来实现会导致非常复杂的变化,那么就可以考虑使用解释器模式构建一个解释器对复杂 ...

  8. Java设计模式-解释器模式(Interpreter)

    解释器模式是我们暂时的最后一讲,一般主要应用在OOP开发中的编译器的开发中,所以适用面比较窄. Context类是一个上下文环境类,Plus和Minus分别是用来计算的实现,代码如下: public ...

  9. javascript设计模式 - 解释器模式(interpreter)

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 大话设计模式--解释器模式 interpreter -- C++实现实例

    1. 解释器模式: 给定一个语言,定义它的文法的一种表示 并 定义一个解释器,这个解释器使用该表示文法 来解释语言中的句子. 如果一种特定类型的问题发生的频率很高,那么可能就值得将该问题的各个实例表述 ...

随机推荐

  1. ssh访问服务器端visdom

    在服务器端启动visdompython -m visdom.server在windows端,将服务器的8097端口重定向到windows端(做了映射绑定):ssh -L 8097:127.0.0.1: ...

  2. 包学会之浅入浅出 Vue.js:开学篇

    2016年,乃至接下来整个2017年,如果你要问前端技术框架什么最火,那无疑就是前端三巨头:React.Angular.Vue.没错,什么jQuery,seaJs,gulp等都逐渐脱离了热点.面试的时 ...

  3. Linux安装配置apache

    Linux安装配置apache   1.获取软件: http://httpd.apache.org/  httpd-2.2.21.tar.gz 2.安装步骤: 解压源文件: 1 tar zvxf ht ...

  4. Java中splite的用法与小技巧

    在java.lang包中也有String.split()方法,与.net的类似,都是返回是一个字符型数组,但使用过程中还有一些小技巧.如执行:"2|33|4".split(&quo ...

  5. android环境的搭配

    android环境一般采用的是adt bundle 下载地址如下: http://tools.android-studio.org/index.php/adt-bundle-plugin 根据自己jd ...

  6. 2017-2018-1 20155232 嵌入式C语言——时钟

    2017-2018-1 20155232 嵌入式C语言--时钟 任务: 在作业本上完成附图作业,要认真看题目要求. 提交作业截图 作弊本学期成绩清零(有雷同的,不管是给别人传答案,还是找别人要答案都清 ...

  7. 20155235 《网络攻防》 实验九 Web安全基础

    20155235 <网络攻防> 实验九 Web安全基础 实验内容 SQL注入攻击 XSS攻击 CSRF攻击 WebGoat WebGoat是OWASP组织研制出的用于进行web漏洞实验的应 ...

  8. 预定义的类型“System.Object”未定义或未导入

    打开一个以前的程序 ,发现报这个错误.检查了程序,发现程序的引用 System 不见了 ,尝试 引用失败.. 查了有人说重新建立 Sln文件有用.. 一头雾水,随后 尝试操作 ,程序有用了 具体步骤: ...

  9. adb连接手机的两种方式

    adb连接手机进行调试有两种方式,一种使用USB线,一种使用无线WiFi. 第一种  使用USB线连接 1. 在手机上启用USB调试 2. CMD窗口输入adb devices,此时可以看到自己的设备 ...

  10. R实战 第九篇:数据标准化

    数据标准化处理是数据分析的一项基础工作,不同评价指标往往具有不同的量纲,数据之间的差别可能很大,不进行处理会影响到数据分析的结果.为了消除指标之间的量纲和取值范围差异对数据分析结果的影响,需要对数据进 ...