`
hanwangkun
  • 浏览: 42041 次
  • 性别: Icon_minigender_1
  • 来自: 漳州
社区版块
存档分类
最新评论

设计模式之行为模式——解释器(Interpreter)模式

 
阅读更多

     继续我们的《设计模式》的学习课程!今天我要讲的是解释器——Interpreter模式,因为昨天同事刚讲了这个模式,趁着脑子里面还有印象,赶紧通过写这篇文章来巩固下!

 

         定义:定义语言的文法,并且建立一个解释器来解释该语言中的句子。它属于类的行为模式。这里的语言意思是使用规定格式和语法的代码。

        意图:抽取语法中最基本的功能,以便于进行代码重用

        类图:


 

   涉及的角色有:

   1、Expression :表达式,是一个接口或抽象类;

   2、TerminalExpression :终结符表达式角色,是表达式的一个子类或实现类

   3、NonterminalOneExpression : 非终结符表达式角色,也是表达式的一个子类或实现类

   4、Context :上下文环境

 

示例如下:

 

package service;

import impl.Context;

import java.math.BigDecimal;

/*
 * 抽象表达式
 */
public interface Expression 
{
   public BigDecimal interpreter(Context con);
}

 

 

 

package impl;

import java.math.BigDecimal;
import java.util.Hashtable;

import service.Expression;

/*
 * 语法上下文
 */
public class Context 
{
	private Hashtable table;
	
	public Context()
	{
		this.table = new Hashtable<Expression,BigDecimal>();
	}
	
	public void addValue(Expression pression,BigDecimal value)
	{
		this.table.put(pression, value);
	}
	
	public BigDecimal getValue(Expression pression)
	{
		BigDecimal value = (BigDecimal) this.table.get(pression);
		return value;
	}
   
}
 

 

 

 

package impl;

import java.math.BigDecimal;

import service.Expression;
/*
 * 变量(终结符表达式)
 */
public class Varial implements Expression 
{

	public BigDecimal interpreter(Context con) 
	{		
		BigDecimal value = con.getValue(this);
		return value;
	}

}

 

 

 

package impl;

import java.math.BigDecimal;

import service.Expression;
/*
 * 常量
 */
public class Constant implements Expression {

	private BigDecimal data;
	public Constant(BigDecimal value)
	{
		this.data = value;
	}
	
	@Override
	public BigDecimal interpreter(Context con) 
	{		
		return data;
	}

}

 

 

 

 

package impl;

import java.math.BigDecimal;

import service.Expression;

public class AddExpression implements Expression {

	private Expression left;
	
	private Expression right;
	
	@Override
	public BigDecimal interpreter(Context con) 
	{
		
		return left.interpreter(con).add(right.interpreter(con));
	}
	
	public AddExpression(Expression left,Expression right)
	{
		this.left = left;
		this.right = right;
	}

}

 

 

 

package impl;

import java.math.BigDecimal;

import service.Expression;

public class DivExpression implements Expression {

	private Expression left;
	
	private Expression right;
	@Override
	public BigDecimal interpreter(Context con) 
	{
		//两个BigDecimal对象相除时,如果除不尽,则会报错,所以要进行舍入
		return left.interpreter(con).divide(right.interpreter(con),2,BigDecimal.ROUND_HALF_UP);
	}
	
	public DivExpression(Expression left,Expression right)
	{
		this.left = left;
		this.right = right;
	}

}
 

 

 

package impl;

import java.math.BigDecimal;

import service.Expression;

public class MultipExpression implements Expression {

	private Expression left;
	
	private Expression right;
	
	@Override
	public BigDecimal interpreter(Context con) 
	{
		return left.interpreter(con).multiply(right.interpreter(con));
	}
	
	public MultipExpression(Expression left,Expression right)
	{
		this.left = left;
		this.right = right;
	}

}

 

 

package client;

import impl.AddExpression;
import impl.Constant;
import impl.Context;
import impl.DivExpression;
import impl.MultipExpression;
import impl.SubtracExpression;
import impl.Varial;

import java.math.BigDecimal;

import service.Expression;

public class TestInterpreter {

	/**
	 * @param args
	 */
	public static void main(String[] args) 
	{
		//(a*b*b)/(a+b-3)
		Context ctx = new Context();
		Expression a = new Varial();
		Expression b = new Varial();
		Expression c = new Constant(new BigDecimal("3"));
		ctx.addValue(a, new BigDecimal("6"));
		ctx.addValue(b, new BigDecimal("8"));
		ctx.addValue(c, c.interpreter(null));
        Expression rs = new DivExpression(new MultipExpression(a, new MultipExpression(b, b)), new SubtracExpression(new AddExpression(a, b), c));
        BigDecimal result = rs.interpreter(ctx);
        System.out.println("计算结果:"+result);
	}

}
 

 

 

package impl;

import java.math.BigDecimal;

import service.Expression;

public class SubtracExpression implements Expression
{
	private Expression left;
	
	private Expression right;

	@Override
	public BigDecimal interpreter(Context con) 
	{
		return left.interpreter(con).subtract(right.interpreter(con));
	}
	
	public SubtracExpression(Expression left,Expression right)
	{
		this.left = left;
		this.right = right;
	}
    
}

 

总结:

解释器以我个人的理解的话,首先它使用的场合不是很多,它适合于解释某种语言或规则。在解释这些规则时要

注意查找规律性的东西,把最基本的功能抽取出来,然后才能利用!

  • 大小: 46.8 KB
分享到:
评论

相关推荐

    一个直线型语言的解释器(二):解释器后端——解释器模式的应用

    在编程领域,解释器模式是一种设计模式,它允许我们构建一个可以解析特定语言或表达式的程序。直线型语言通常指的是那些语法简单、结构单一的语言,比如配置文件或简单的脚本语言。 解释器模式的核心在于定义一个...

    《java设计模式》课后习题模拟试题解答——刘伟.zip

    **行为型模式**:包括策略(Strategy)、模板方法(Template Method)、观察者(Observer)、迭代器(Iterator)、访问者(Visitor)、责任链(Chain of Responsibility)、命令(Command)、备忘录(Memento)、...

    设计模式代码——c#

    17. 解释器模式(Interpreter Pattern) 18. 中介者模式(Mediator Pattern) 19. 职责链模式(Chain of Responsibility Pattern) 20. 备忘录模式(Memento Pattern) 21. 策略模式(Strategy Pattern) 22. 访问者...

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

    5.3 INTERPRETER(解释器)—类行为型 模式 162 5.4 ITERATOR(迭代器)—对象行为型 模式 171 5.5 MEDIATOR(中介者)—对象行为型 模式 181 5.6 MEMENTO(备忘录)—对象行为型 模式 188 5.7 OBSERVER(观察者)—...

    设计模式精解——GoF23中设计模式解析

    11. **Interpreter模式**:给出一个语言的文法,并定义一个解释器来解释由该语言编写的程序。这里的“语言”是指使用规定格式和语义规则组成的一系列规则。这种模式适用于需要定义语言的语法或符号的解析程序时。 #...

    设计模式精解-GoF 23种设计模式解析附C++.pdf

    - **Interpreter模式**:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 #### 4. 总结 设计模式的学习不仅是为了记住每种模式的应用场景,更重要的是理解其...

    Python设计模式之解释器模式原理与用法实例分析

    本文实例讲述了Python设计模式之解释器模式原理与用法。...设计模式——解释器模式 解释器模式(Interpreter Pattern):给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的

    X-gen PPT下载——《研磨设计模式》 实战

    3. **行为型模式**:包括责任链模式(Chain of Responsibility)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、中介者模式(Mediator)、备忘录模式(Memento)、观察者模式...

    设计模式PPT---25种设计模式详解

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

    设计模式 让你轻松理解设计模式,提高开发效率

    解释器模式是一种行为型设计模式,它为特定语言的句子定义一个表示,并提供一个解释器来解释该语言的句子。该模式适用于当可以将一个需要解析或者翻译的问题表示成为一个特定类型的语法时。文章中通过“MM解释规则”...

    23种 设计模式---面向对象的基本原则

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

    设计模式C++版

    11. Interpreter模式,解释器模式,给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 文档在最后提出了设计模式在开发中的体验,讨论了设计模式的思考和应用。...

    设计模式精解-GoF 23种设计模式解析

    ### 设计模式精解——GoF 23种设计模式解析 #### 0. 引言 ##### 0.1 设计模式解析(总序) 设计模式是软件工程领域的一个重要概念,它代表着一系列被广泛接受的解决方案,用于解决特定类型的软件设计问题。通过...

    设计模式精解-GoF 23种设计模式解析附C++实现源码.pdf

    - **3.11 Interpreter模式**:解释器模式给出一个语言的文法,并定义一个解释器来解释由该语言编写的程序。 通过深入学习这23种设计模式及其在C++中的实现,不仅可以提升软件开发的质量,还可以提高个人的技术水平...

    design-pattern-java.pdf

    请求发送者与接收者解耦——命令模式(六) 解释器模式-Interpreter Pattern 自定义语言的实现——解释器模式(一) 自定义语言的实现——解释器模式(二) 自定义语言的实现——解释器模式(三) 自定义语言的实现...

    设计模式C++版(pdf版)

    ### 设计模式精解——GoF 23种设计模式解析及C++实现源码 #### 引言 设计模式是软件工程领域中一个极为重要的概念,它代表着一系列被广泛接受的解决特定问题的方法。GoF(Gang of Four)所提出的23种设计模式更是...

    设计模式精解-GoF 23种设计模式解析附C++实现源码

    - **3.11 Interpreter模式**:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 #### 4. 总结 设计模式的学习是一个循序渐进的过程,需要不断地实践和思考。...

Global site tag (gtag.js) - Google Analytics