前言:【模式总览】——————————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. python+requests实现接口测试 - cookies的使用 (转载)

    出自:https://www.cnblogs.com/nizhihong/p/6699492.html 在很多时候,发送请求后,服务端会对发送请求方进行身份识别,如果请求中缺少识别信息或存在错误的识别 ...

  2. 20155238 《JAVA程序设计》实验二(Java面向对象程序设计)实验报告

    实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验要求 1.没有Linux基础的同学建议先学习<L ...

  3. 20155337 《网络对抗》 Exp2 后门原理与实践

    20155337 <网络对抗> Exp2 后门原理与实践 一.基础问题回答 - 例举你能想到的一个后门进入到你系统中的可能方式? 在Unix里,login程序通常用来对telnet来的用户 ...

  4. 汇编 do while循环

    do while生成的汇编代码  do while汇编还原成C++代码 一. do while成生的汇编代码 // int i=0; // do // { // i++; // } while ( ...

  5. STM32烧录的常用方式

    stm32烧录常用的方式一般为ST-LINK(或者J-tag)下载仿真和ISP下载 一.仿真器下载 仿真器分为J-TAG和SWD仿真,SWD仿真只需要4根线(VCC.GND.CLK.DATA)就可以了 ...

  6. Qt控件使用汇总

    QTableWidget: //tab居中显示 QTabWidget::tab-bar { alignment: center; } //tab边框样式,边框颜色,前景色 QTabBar::tab { ...

  7. TMS320VC5509使用nof flash AM29LV400

    1. 硬件接口如下,其中nor flash的使用方法,写的时候和NAND FLASH是一样的,读的时候和DRAM是一样的 2. 看下擦除指令和编程指令 3. 代码如下 #include <csl ...

  8. *args和**kwargs在python中的作用

    我发现PYTHON新手在理解*args和**kwargs这两个魔法变量的时候有些困难.他们到底是什么呢? 首先,我先告诉大家一件事情,完整地写*args和**kwargs是不必要的,我们可以只写*和* ...

  9. shell变量常用方法

    变量之数组操作: 参考网址:http://www.jb51.net/article/55253.htm #直接赋值 [root@local-]=chengd [root@local-]=xrd [ro ...

  10. js 二进制操作

    //二进制保存var content = "file content!"; var data = new Blob([content],{type:"text/plain ...