设计模式之解释器模式 ——初学

1、定义


解释器模式(interpreter),给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语句中的句子。

2、解决的问题


      如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语句中的句子,这样就可以构造一个解释器,该解释器通过解释这些句子来解决该问题。

比方说,我们通常在字符串中搜索匹配的字符或判断一个字符串是否符合我们规定的格式,我们会用到正则表达式,正则表达式就是解释器模式的一种应用,解释器为正则表达式定义了一个文法, 如何表示一个特定的正则表达式,以及如何解释这个正则表达式。

3、UML

各个类说明:

  • 抽象表达式角色(AbstractExpression): 声明一个抽象的解释操作,这个接口为所有具体表达式角色都要实现的.
  • 终结符表达式角色(TerminalExpression): 实现与文法中的元素相关联的解释操作,通常一个解释器模式中只有一个终结符表达式,但有多个实例对应不同的终结符.
  • 终结符就是语言中用到的基本元素,一般不能再被分解,如: x -> xa, 这里a是终结符,因为没有别的规则可以把a变成别的符号,不过x可以变成别的符号,所以x是非终结符.
  • 非终结符表达式角色(NonterminalExpression): 文法中的每条规则对应于一个非终结表达式, 非终结表达式根据逻辑的复杂程度而增加,原则上每个文法规则都对应一个非终结符表达式.
  • Context:包含解释器之外的全局信息

4、应用场景

当一个语言需要解释执行,并且你课将该语言中的句子表示为一个抽象语法树时,可以使用解析器模式。

5、使用解析器模式的好处

用了解析器模式,就意味着可以很容易改变和扩展文法,因为该模式使用类来表示文法规则,我们可以使用继承来改变或扩展文法。也比较容易实现文法,因为定义抽象语法树中各个节点的类的实现大题类似,这些类都易于直接编写。

6、不足

解析器模式为文法中的每一条规则至少定义了一个类,因此包含许多规则的文法可能难以管理和维护。建议当文法非常复杂是,使用其他的技术如语法分析程序或编译器生成器来处理。

7、应用

正则表达式,浏览器等。

8、demo

抽象表达式
package com.zcr.interpreter;

//抽象表达式
public abstract class AbstractExpression
{
    public abstract void Interpret(Context contex);
}
非终端解析器
package com.zcr.interpreter;

public class NonterminalExpression extends AbstractExpression
{

    @Override
    public void Interpret(Context contex)
    {
        System.out.println("非终端解析器");

    }

}
终端解析器
package com.zcr.interpreter;

//终端解析器
public class TerminalExpression extends AbstractExpression
{

    @Override
    public void Interpret(Context contex)
    {
        System.out.println("中断解释器");
    }

}
package com.zcr.interpreter;

public class Context
{
    private String input;

    public String getInput()
    {
        return input;
    }

    public void setInput(String input)
    {
        this.input = input;
    }

    private String output;

    public String getOutput()
    {
        return output;
    }

    public void setOutput(String output)
    {
        this.output = output;
    }

}

主函数调用测试

package com.zcr.interpreter;

import java.util.ArrayList;
import java.util.List;

public class InterpreterTest
{
    public static void main(String[] args)
    {
        Context context = new Context();
        List<AbstractExpression> list = new ArrayList<AbstractExpression>();
        list.add(new TerminalExpression());
        list.add(new NonterminalExpression());
        list.add(new TerminalExpression());
        list.add(new TerminalExpression());

        for(AbstractExpression exp : list)
        {
            exp.Interpret(context);
        }

    }
}

结果:

时间: 2024-12-27 12:30:06

设计模式之解释器模式 ——初学的相关文章

大话设计模式_解释器模式(Java代码)

解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 简单描述:一个AbstractExpression类,多个子类,存在一个Interpret方法,转义Context对象的信息.客户端根据信息实例化不同的Expression类,并调用其转义方法(这个过程可以使用简单工厂+反射进行) 大话设计模式中的截图: 代码例子: 假设HTML代码解释器: (1)第一类标签<HTML>(开始)/<HEAD>(头信息)/<BODY&g

GOF23设计模式之解释器模式和访问器模式的理解

设计模式之解释器模式Interpreter      是一种不常用的设计模式      用于描述如何构成一个简单的语言解释器,主要用于使用面向对象语言开发的编译器和解释器设计.      当我们需要开发一种新的语言时,可以考虑使用解释器模式.      尽量不要使用解释器模式,后期维护会有很大麻烦.在项目中可以使用jruby,Groovy,java的js引擎来代替解释器的作用,弥补java语言的不足. 开发中常见的场景:      EL表达式的处理      正则表达式解释器      SQL语

设计模式之解释器模式(Interpreter)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

C#设计模式:解释器模式(Interpreter Pattern)

一,C#设计模式:解释器模式(Interpreter Pattern) 1,解释器模式的应用场合是Interpreter模式应用中的难点,只有满足“业务规则频繁变化,且类似的模式不断重复出现,并且容易抽象为语法规则的问题”才适合使用解释器模式2,解释器设计模式每个解释的类有自己的规则,并且与其他业务规则不冲突 二,如下代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; u

Head First设计模式之解释器模式

一.定义 给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子. 主要解决:对于一些固定文法构建一个解释句子的解释器. 何时使用:如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子.这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题. 如何解决:构件语法树,定义终结符与非终结符. 二.结构 组成: AbstractExpression(抽象表达式):定义解释器的接口,约定解释器的解释操作. Termi

php设计模式之解释器模式

解释器设计模式用于分析一个实体的关键元素,并且针对每个元素都提供自己的解释或相应的动作. <?php /** * 解释器模式 */ class User { protected $_username; public function __construct($username) { $this->_username = $username; } public function getProfilePage() { $profile = "<h2>I like never

【GOF23设计模式】解释器模式 &amp; 访问者模式

来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_解释器模式.访问者模式.数学表达式动态解析库式 1.解释器模式Interpreter  2.访问者模式Visitor 

【Unity与23种设计模式】解释器模式(Interpreter)

GoF中定义: "定义一个程序设计语言所需要的语句,并提供解释来解析(执行)该语言." 传统上,执行程序代码通常通过两种方式 第一种:编译程序 第二种:解释器 常见的使用解释器的程序设计语言 包含流行与网页设计领域中的脚本语言 如JavaScript.PHP.Ruby等 这些程序代码经过一般文本编辑器编写完成后放入指定的位置 就可以由应用程序中的解释器直接执行 包括Lua Unity中 编写好的脚本程序执行之前会被UnityEngine编译过 严格来说不算是解释器模式 但与十几年前的开

设计模式之解释器模式--- Pattern Interpreter

模式的定义 类型 行为类 模式的使用场景 优点 缺点 UML类图 角色介绍 模式的通用源码 输出结果 Android源码中的模式实现 杂谈 参考资料 (1).设计模式之禅-第27章 解释器模式 (2)解释器模式 https://github.com/simple-android-framework/android_design_patterns_analysis