`
q445862108
  • 浏览: 83503 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

(Interpreter)模式:

    博客分类:
  • java
阅读更多
解释器(Interpreter)模式:
解释器模式是类的行为模式。给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器
来解释这个语言中的句子。

一、解释器模式所涉及的角色
1、抽象表达式角色:声明一个所有的具体表达式角色都需要实现的抽象接口。这个接口主要是一个interpret()方法,称做解释操作。
2、终结符表达式角色:这是一个具体角色。
(1)实现了抽象表达式角色所要求的接口,主要是一个interpret()方法;
(2)文法中的每一个终结符都有一个具体终结表达式与之相对应。
3、非终结符表达式角色:这是一个具体角色。
(1)文法中的每一条规则 R=R1R2.....Rn 都需要一个具体的非终结符表达式类;
(2)对每一个 R1R2.....Rn 中的符号都持有一个静态类型为Expression的实例变量。
(3)实现解释操作,即 interpret()方法。解释操作以递归方式调用上面所提到的代表 R1R2.....Rn  中的各个符号的实
     例变量
4、客户端角色:代表模式的客户端它有以下功能
(1)建造一个抽象语法树(AST或者Abstract Syntax Tree)
(2)调用解释操作interpret()。
5、环境角色:(在一般情况下,模式还需要一个环境角色)提供解释器之外的一些全局信息,比如变量的真实量值等。

(抽象语法树的每一个节点都代表一个语句,而在每一个节点上都可以执行解释方法。这个解释方法的执行就代表这个语句被解释。
  由于每一个语句都代表对一个问题实例的解答。)

来举一个加减乘除的例子吧,实现思路来自于《java与模式》中的例子。每个角色的功能按照上面提到的规范来实现。
  
  //上下文(环境)角色,使用HashMap来存储变量对应的数值
  
  class Context
  {
  private Map valueMap = new HashMap();
  public void addValue(Variable x , int y)
  {
  Integer yi = new Integer(y);
  valueMap.put(x , yi);
  }
  
  public int LookupValue(Variable x)
  {
  int i = ((Integer)valueMap.get(x)).intValue();
  return i ;
  }
  }
  
  //抽象表达式角色,也可以用接口来实现
  
  abstract class Expression
  {
  public abstract int interpret(Context con);
  }
  
  //终结符表达式角色
  
  class Constant extends Expression
  {
  private int i ;
  public Constant(int i)
  {
  this.i = i;
  }
  
  public int interpret(Context con)
  {
  return i ;
  }
  }
  
  class Variable extends Expression
  {
  public int interpret(Context con)
  {
  //this为调用interpret方法的Variable对象
  return con.LookupValue(this);
  }
  }






//非终结符表达式角色
  
  class Add extends Expression
  {
  private Expression left ,right ;
  public Add(Expression left , Expression right)
  {
  this.left = left ;
  this.right= right ;
  }
  
  public int interpret(Context con)
  {
  return left.interpret(con) + right.interpret(con);
  }
  }
  
  class Subtract extends Expression
  {
  private Expression left , right ;
  public Subtract(Expression left , Expression right)
  {
  this.left = left ;
  this.right= right ;
  }
  
  public int interpret(Context con)
  {
  return left.interpret(con) - right.interpret(con);
  }
  
  }
  
  class Multiply extends Expression
  {
  private Expression left , right ;
  public Multiply(Expression left , Expression right)
  {
  this.left = left ;
  this.right= right ;
  }
  public int interpret(Context con)
  {
  return left.interpret(con) * right.interpret(con);
  }
  }
  
  class Division extends Expression
  {
  private Expression left , right ;
  public Division(Expression left , Expression right)
  {
  this.left = left ;
  this.right= right ;
  }
  
  public int interpret(Context con)
  {
  try{
  return left.interpret(con) / right.interpret(con);
  }catch(ArithmeticException ae)
  {
  System.out.println("被除数为0!");
  return -11111;
  }
  }
  }
  
  //测试程序,计算 (a*b)/(a-b+2)
  
  public class Test
  {
  private static Expression ex ;
  private static Context con ;
  public static void main(String[] args)
  {
  con = new Context();
  //设置变量、常量
  Variable a = new Variable();
  Variable b = new Variable();
  Constant c = new Constant(2);
  //为变量赋值
  con.addValue(a , 5);
  con.addValue(b , 7);
  //运算,对句子的结构由我们自己来分析,构造
  ex = new Division(new Multiply(a , b), new Add(new Subtract(a , b) , c));
  System.out.println("运算结果为:"+ex.interpret(con));
  }
  }














01.package designpattern.intpreter;  
02.import java.util.HashMap;  
03. 
04.public interface Expression {  
05.    public int interprete(HashMap<String,Integer> var);  
06.}  
07.//////////////////////////  
08.package designpattern.intpreter;  
09. 
10.import java.util.HashMap;  
11. 
12.public class VarExpression implements Expression{  
13.    private String key;  
14.    public VarExpression(String key){  
15.        this.key = key;  
16.    }  
17.      
18.    public int interprete(HashMap<String,Integer> var) {  
19.        return (Integer)var.get(this.key);  
20.    }  
21.}  
22.////////////////////////////  
23.package designpattern.intpreter;  
24. 
25.public abstract class SymbolExpression implements Expression {  
26.    protected Expression left;  
27.    protected Expression right;  
28. 
29.    // 所有的解析公式都应只关心自己左右两个表达式的结果  
30.    public SymbolExpression(Expression left, Expression right) {  
31.        this.left = left;  
32.        this.right = right;  
33.    }  
34.}  
35.//////////////////////////////////  
36.package designpattern.intpreter;  
37. 
38.import java.util.HashMap;  
39. 
40.public class AddExpression extends SymbolExpression {  
41.    public AddExpression(Expression _left, Expression _right) {  
42.        super(_left, _right);  
43.    }  
44. 
45.    // 把左右两个表达式运算的结果加起来  
46.    public int interprete(HashMap<String, Integer> var) {  
47.        return super.left.interprete(var) + super.right.interprete(var);  
48.    }  
49.}  
50.///////////////////////////////////  
51.package designpattern.intpreter;  
52. 
53.import java.util.HashMap;  
54. 
55.public class SubExpression extends SymbolExpression {  
56.    public SubExpression(Expression _left, Expression _right) {  
57.        super(_left, _right);  
58.    }  
59. 
60.    // 左右两个表达式相减  
61.    public int interprete(HashMap<String, Integer> var) {  
62.        return super.left.interprete(var) - super.right.interprete(var);  
63.    }  
64. 
65.}  
66.////////////////////////////  
67.package designpattern.intpreter;  
68.import java.util.HashMap;  
69.import java.util.Stack;  
70. 
71.public class Calculator {  
72.    private Expression expression;  
73.    public Calculator(String expStr) {  
74.        // 定义一个堆栈,安排运算的先后顺序  
75.        Stack<Expression> stack = new Stack<Expression>();  
76.        // 表达式拆分为字符数组  
77.        char[] charArray = expStr.toCharArray();  
78.        // 运算  
79.        Expression left = null;  
80.        Expression right = null;  
81.        for (int i = 0; i < charArray.length; i++) {  
82.            switch (charArray[i]) {  
83.            case '+': // 加法  
84.                // 加法结果放到堆栈中  
85.                left = stack.pop();  
86.                right = new VarExpression(String.valueOf(charArray[++i]));  
87.                stack.push(new AddExpression(left, right));  
88.                break;  
89.            case '-':  
90.                left = stack.pop();  
91.                right = new VarExpression(String.valueOf(charArray[++i]));  
92.                stack.push(new SubExpression(left, right));  
93.                break;  
94.            default: // 公式中的变量  
95.                stack.push(new VarExpression(String.valueOf(charArray[i])));  
96.            }  
97.        }  
98.        // 把运算结果抛出来  
99.        this.expression = stack.pop();  
100.    }  
101. 
102.    // 开始运算  
103.    public int run(HashMap<String, Integer> var) {  
104.        return this.expression.interprete(var);  
105.    }  
106.}  
107.//////////////////////////////  
108.//测试用例  
109.package designpattern.intpreter;  
110.import java.util.HashMap;  
111. 
112.public class Client {  
113.    public static void main(String[] args){  
114.        //构造运算元素的值列表  
115.        HashMap<String, Integer> ctx = new HashMap<String, Integer>();  
116.        ctx.put("a", 10);  
117.        ctx.put("b", 20);  
118.        ctx.put("c", 30);  
119.        ctx.put("d", 40);  
120.        ctx.put("e", 50);  
121.        ctx.put("f", 60);  
122.        Calculator calc = new Calculator("a+b-c");  
123.        int result = calc.run(ctx);  
124.        System.out.println("Result of a+b-c: " + result);  
125.        calc = new Calculator("d-a-b+c");  
126.        result = calc.run(ctx);  
127.        System.out.println("Result of d-a-b+c: " + result);  
128.    }  
129.} 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sunxing007/archive/2010/04/12/5477634.aspx
分享到:
评论

相关推荐

    23种设计模式(C++).pdf

    - Interpreter模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 在实际开发中,设计模式的使用可以帮助开发人员避免重新发明轮子,同时也能够为团队提供...

    Interpreter模式

    “Interpreter模式”是设计模式中的一种,主要应用于解决表达式问题,它为特定语言提供了表达式接口,使得程序可以理解和执行这些表达式。在Java中实现Interpreter模式,可以创建一个灵活的、可扩展的解析系统,允许...

    关于23种设计模式的有趣见解.docx

    17、INTERPRETER模式:用于描述语言的语法规则,并且可以解释这些规则。 18、MEDIATOR模式:中央协调器模式,用于定义一个中心协调者对象,封装了一组对象之间的交互关系。 19、MEMENTO模式:保存一个对象的内部状态...

    23种设计模式(C++)

    - Interpreter模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 在实际开发中,设计模式可以帮助开发者写出更加灵活和可维护的代码。例如,通过 ...

    《设计模式:可复用面向对象软件的基础》英文版

    ### 设计模式:可复用面向对象软件的基础 #### 书籍概述 《设计模式:可复用面向对象软件的基础》是一本由Erich Gamma、Richard Helm等四位国际知名的软件工程师共同编写的经典之作,该书提供了面向对象软件设计中...

    C++ Interpreter模式

    Interpreter模式是一种行为设计模式,它允许我们使用表达式来定义语言的文法,并提供一个解释器来解释这些表达式。在C++中,Interpreter模式通常用于处理简单的语言或表达式,比如配置文件、计算器程序或者游戏规则...

    设计模式C++版.pdf

    11. Interpreter模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 文档作者强调学习设计模式的重要性,认为通过学习和应用设计模式,可以深化对面向对象...

    设计模式:可复用面向对象软件的基础--详细书签版

    5.3 interpreter(解释器)—类行为型 模式 162 5.4 iterator(迭代器)—对象行为型 模式 171 5.5 mediator(中介者)—对象行为型 模式 181 5.6 memento(备忘录)—对象行为型 模式 188 5.7 observer...

    (行为型模式) Interpreter 解释器模式

    C#面向对象设计模式 (行为型模式) Interpreter 解释器模式 视频讲座下载

    Interpreter模式实现简单计算器

    Interpreter模式是一种行为设计模式,它允许我们定义一个语言的文法,并提供一个解释器来处理该语言中的句子。在这个场景中,我们将运用Interpreter模式来实现一个简单的计算器,它能够执行基本的算术运算,如加法、...

    C++设计模式课件25_Interpreter.pdf

    1. 设计模式:设计模式是在软件工程中,对软件设计中普遍存在的问题的典型解决方案。设计模式被分为三个主要类别,包括创建型模式、结构型模式和行为型模式。创建型模式包括单例、工厂、建造者等模式;结构型模式...

    1.《设计模式:可复用面向对象软件的基础(完整书签)》

    《设计模式:可复用面向对象软件的基础》是软件工程领域的一部经典著作,由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位大师合著,被誉为“Gang of Four”(GoF)的经典之作。这本书详细阐述了23...

    设计模式_设计模式_

    1. 创建型模式: - 单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。 - 原型模式(Prototype):通过复制已有对象来创建新对象,减少类的实例化过程。 - 工厂方法模式(Factory Method):...

    设计模式可复用面向对象软件的基础 源码

    在《设计模式:可复用面向对象软件的基础》一书中,作者Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides(通常被称为GoF,Gang of Four)详细阐述了23种经典的设计模式。这些模式分为三类:创建型模式、...

    设计模式:Java语言中的应用.zip

    1. 创建型模式:这类模式主要处理对象的创建,使得代码与对象的创建过程解耦。包括单例模式(Singleton)、工厂模式(Factory)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)和原型模式(Prototype)...

    《设计模式:可复用面向对象软件的基础》

    《设计模式:可复用面向对象软件的基础》是软件工程领域的一部经典著作,由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位大师合著,被誉为“Gang of Four”(GoF)的经典之作。这本书详细阐述了23...

    java23种设计模式详解+源码(绝对详解)

    - 解释器模式(Interpreter):给定一种语言,定义其语法的表示,并提供一个解释器来处理这种语言中的句子。 - 迭代器模式(Iterator):提供一种方法顺序访问聚合对象的元素,而又不暴露其底层表示。 - 中介者...

    GoF 的 23 种设计模式

    GoF 的 23 种设计模式的分类,现在对各个模式的功能进行介绍。 单例(Singleton)模式:某个类只能生成一个实例,该类...解释器(Interpreter)模式:提供如何定义语言的文法,以及对语言句子的解释方法,即解释器。

    Interpreter 解释器模式

    解释器模式是一种行为设计模式,它允许我们定义一个语言的语法,并提供一种方式来解析该语言的表达式。在C#中,解释器模式通常用于处理简单的语言结构或执行基于特定规则的运算。这种模式的核心在于创建一个抽象语法...

Global site tag (gtag.js) - Google Analytics