设计模式 -- 解释器模式(Interpreter Pattern)-阿里云开发者社区

开发者社区> 西北野狼> 正文

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

简介: 2015年12月15日00:19:02 今天只看了理论和demo,明天再写文章,跑步好累 2015年12月15日21:36:00 解释器模式用来解释预先定义的文法。 《大话设计模式》里面这么定义:如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个势力表述为一个简单语言中的句子,这样就可以构建一个解释器,该解释器通过解释这些句子来解决问题。
+关注继续查看

2015年12月15日00:19:02

今天只看了理论和demo,明天再写文章,跑步好累

2015年12月15日21:36:00

解释器模式用来解释预先定义的文法。

《大话设计模式》里面这么定义:如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个势力表述为一个简单语言中的句子,这样就可以构建一个解释器,该解释器通过解释这些句子来解决问题。

解释器模式包含以下几个类:

  1. AbstractExpression: 抽象表达式。声明一个抽象的解释操作,该接口为抽象语法树中所有的节点共享。
  2. TerminalExpression: 终结符表达式。实现与文法中的终结符相关的解释操作。实现抽象表达式中所要求的方法。文法中每一个终结符都有一个具体的终结表达式与之相对应。
  3. NonterminalExpression: 非终结符表达式。为文法中的非终结符相关的解释操作。
  4. Context: 环境类。包含解释器之外的一些全局信息。
  5. Client: 客户类。

优点:

容易改变和扩展文法,因为该模式使用类来标示文法规则,你可使用继承来改变和扩展该文法。也比较容易实现文法,因为定义抽象语法树种各个节点的类实现答题想死,这些类都抑郁编写。

缺点:解释器模式为文法中的每一条规则至少定义了一个类,因此包含许多规则的文法可能难以管理和维护,建议文法复杂的情况下使用其他技术如预防分析程序和编译器生成器来处理。

 下面是个demo:

首先创建环境类Context:

package InterpreterPattern;

/*
 * 上下文环境类,用来保存文法,包含解释器之外的一些全局信息
 */
public class Context {
    
    private String input;
    private int output;
    
    public Context(String input) {
        this.input = input;
    }
    
    public String getInput() {
        return input;
    }
    public void setInput(String input) {
        this.input = input;
    }
    public int getOutput() {
        return output;
    }
    public void setOutput(int output) {
        this.output = output;
    }
}

然后创建抽象的Expression 类:

/**
 * 
 * @ClassName: Expression
 * @Description: TODO(解释器的抽象类,抽象解释器的解释操作) 
 */
public abstract class Expression {
    public abstract void interpret(Context context);
}

然后就是实现抽象类:

自减操作:

package InterpreterPattern;
/**
 * 
 * @ClassName: MinusExpression
 * @Description: TODO(自减操作) 
 */
public class MinusExpression extends Expression{
    
    @Override
    public void interpret(Context context) {
        System.out.println("自动递减");
        String input = context.getInput();
        int inInput = Integer.parseInt(input);
        --inInput;
        context.setInput(String.valueOf(inInput));
        context.setOutput(inInput);
    }
    
}

自加操作:

package InterpreterPattern;
/**
 * 
 * @ClassName: PlusExpression
 * @Description: TODO(自加操作) 
 */
public class PlusExpression extends Expression {

    @Override
    public void interpret(Context context) {
        System.out.println("自动递增");
        String input = context.getInput();
        int inInput = Integer.parseInt(input);
        ++inInput;
        context.setInput(String.valueOf(inInput));
        context.setOutput(inInput);
        
    }
    
}

测试类:

package InterpreterPattern;

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

/**
 * @ClassName: Test
 * @Description: TODO(测试类) 
 */
public class Test {
    
    public static void main(String[] args) {
        String number = "99";
        Context context = new Context(number);   
        List<Expression> list = new ArrayList<Expression>();
        list.add(new PlusExpression());
        list.add(new MinusExpression());
        for(Expression ex : list) {
            ex.interpret(context);
            System.out.println(context.getOutput());
        }
    }
    
}

运算结果为:

自动递增
100
自动递减
99

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Net设计模式实例之单例模式( Singleton Pattern)
一、单例模式简介(Brief Introduction) 单例模式(Singleton Pattern),保证一个类只有一个实例,并提供一个访问它的全局访问点。单例模式因为Singleton封装它的唯一实例,它就可以严格地控制客户怎样访问它以及何时访问它。
740 0
带你读《计算机组成与体系结构:性能设计(英文版·原书第10版)》之二:Performance Issues
本书以Intel x86体系结构和ARM两个处理器系列为例,将当代计算机系统性能设计问题与计算机组成的基本概念和原理紧密联系起来,介绍了当代计算机体系结构的主流技术和最新技术。本书作者曾13次获a得美国教材和学术专著作者协会颁发的年度最佳计算机科学教材奖。目前,他是一名独立顾问,为众多计算机和网络制造商、软件开发公司以及政府前沿研究机构提供服务。
567 0
怎么设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程
7415 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
4613 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
8268 0
设计模式(十六) 解释器模式
解释器模式是一种行为型模式,它的主要作用是用一种方式来实现对表达式或文法的处理。我们可以使用解释器模式处理语言的解析,在设计计算机语言的时候解释器模式很有用处。
627 0
+关注
西北野狼
擅长Android ,J2EE开发 博客园地址:http://www.cnblogs.com/androidsuperman/p/7834762.html github地址: https://github.com/soyoungboy
368
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载