设计模式 -- 解释器模式(Interpreter Pattern)
2015年12月15日00:19:02
今天只看了理论和demo,明天再写文章,跑步好累
2015年12月15日21:36:00
解释器模式用来解释预先定义的文法。
《大话设计模式》里面这么定义:如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个势力表述为一个简单语言中的句子,这样就可以构建一个解释器,该解释器通过解释这些句子来解决问题。
解释器模式包含以下几个类:
- AbstractExpression: 抽象表达式。声明一个抽象的解释操作,该接口为抽象语法树中所有的节点共享。
- TerminalExpression: 终结符表达式。实现与文法中的终结符相关的解释操作。实现抽象表达式中所要求的方法。文法中每一个终结符都有一个具体的终结表达式与之相对应。
- NonterminalExpression: 非终结符表达式。为文法中的非终结符相关的解释操作。
- Context: 环境类。包含解释器之外的一些全局信息。
- 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
设计模式 -- 解释器模式(Interpreter Pattern)的更多相关文章
- C#设计模式——解释器模式(Interpreter Pattern)
一.概述 在软件开发特别是DSL开发中常常需要使用一些相对较复杂的业务语言,如果业务语言使用频率足够高,且使用普通的编程模式来实现会导致非常复杂的变化,那么就可以考虑使用解释器模式构建一个解释器对复杂 ...
- 乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern)
原文:乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern) 作 ...
- C#设计模式:解释器模式(Interpreter Pattern)
一,C#设计模式:解释器模式(Interpreter Pattern) 1,解释器模式的应用场合是Interpreter模式应用中的难点,只有满足“业务规则频繁变化,且类似的模式不断重复出现,并且容易 ...
- 二十四种设计模式:解释器模式(Interpreter Pattern)
解释器模式(Interpreter Pattern) 介绍给定一个语言, 定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子. 示例有一个Message实体类,某个类对它的 ...
- javascript设计模式 - 解释器模式(interpreter)
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 大话设计模式--解释器模式 interpreter -- C++实现实例
1. 解释器模式: 给定一个语言,定义它的文法的一种表示 并 定义一个解释器,这个解释器使用该表示文法 来解释语言中的句子. 如果一种特定类型的问题发生的频率很高,那么可能就值得将该问题的各个实例表述 ...
- 原始的解释器模式(Interpreter Pattern)
解释器模式的定义(现实项目中非常少遇到,因此直接理论先...) 解释器模式是一种依照规定语法进行解析的方案,在如今项目中使用较少,其定义为:给定一门语言,定义它的方法的一种表示,并定义一个解释器,该解 ...
- php解释器模式( interpreter pattern)
... <?php /* The interpreter pattern specifies how to evaluate language grammar or expressions. W ...
- 设计模式:解释器模式(Interpreter)
为人处事是一门大学问,察言观色.听懂弦外之音都是非常重要的,老板跟你说“XX你最近表现平平啊,还得要多努力”,如果你不当回事,平常对待,可能下次就是“XX,恩,你人还是不错,平常工作也很努力,但是我想 ...
- 十一个行为模式之解释器模式(Interpreter Pattern)
定义: 定义一个语言的文法,可以使用一个解释器来解释其文法.定义终结符和非终结符的统一接口,并使用抽象对象建立非终结符与其它元素的关联. 结构图: AbstractExpression:抽象表达式类, ...
随机推荐
- XAF-BI.Dashboard模块概述 web/win
Dashboard模块介绍了在ASP.NET XAF 和 WinForms 应用程序中简单的集成 DevExpress Dashboard控件的方法. 其实不仅仅是控件,利用了现有的XAF数据模型,这 ...
- js实现表格的增删改查
这份代码实现了对表格的增加,删除,更改,查询. 点击一次添加按钮,表格会增加一行. 点击重置按钮,输入框的内容会被清空. 添加一行后,最后两格为更改和删除.点击更改,原有内容会各自显示在一个输入框内, ...
- SQL SERVER BUG--Alwayson日志备份报错
数据库版本 SQL SERVER 2012 企业版,版本号:11.0.5582.0 问题场景: 数据库配置Alwayson环境,同机房2节点同步自动切换+跨机房异步,在异步机房中选取同一节点做完整备份 ...
- Git安装使用
转载:http://www.open-open.com/lib/view/open1414396787325.html 1.window版地址 https://git-for-windows.gith ...
- Unity中的Mathf类
Mathf.Abs绝对值 计算并返回指定参数 f 绝对值. Mathf.Acos反余弦 static function Acos (f : float) : float 以弧度为单位计算并返回参数 f ...
- 关于WIN7 家庭版 iis 部署问题
预装Win7家庭普通版系统的iis部署 必先升级为win7 预计10分钟因个人电脑而异 Win7家庭普通版系统的机器可免费升级为旗舰版.(WIN7任何低版本的系统 都可以升级到旗舰版) 开始的步骤: ...
- mysql 保存emoji时报,数据库报错:Caused by: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x82\xF0\x9F...' for column 'review' at row 1
错误原因:我们可以看到错误提示中的字符0xF0 0x9F 0x98 0x84 ,这对应UTF-8编码格式中的4字节编码(UTF-8编码规范).正常的汉字一般不会超过3个字节,为什么为出现4个字节呢?实 ...
- Hex Workshop(16进制编辑利器) 6.7.2绿色版
软件名称: Hex Workshop 6.7.2绿色版(16进制编辑利器) 软件语言: 简体中文 授权方式: 免费软件 运行环境: Win 32位/64位 软件大小: 1.8MB 图片预览: 软件简介 ...
- Linq——Count、Sum、Min、Max、Average
using System; using System.Data; using System.Configuration; using System.Linq; using System.Web; us ...
- git换行符之autoCRLF配置的意义
关于git换行符处理的问题,我查了一查,自己的设置中,global-config中设了autocrlf=false,systemwide中将autocrlf设成了true. 关于配置的作用域,syst ...