Interpreter (解释器)动作型类1 Intent_意图2给定语言,定义其方法表现,使用其标识符定义解释语言内的句子的解释器
Motivation_动机3针对几种固定方法构建解释语句的解释器
Applicability_适用性4如果某个特定类型问题的频率足够高,则将该问题的每个实例表示为简单语言的句子是值得的。 通过解释这些语句来构建解决问题的解释器
sructure_fabric5
Participants_参与者6 AbstractExpression(抽象表达式):定义解释器接口,解释器解释操作3358www.Sina.com/:与方法中的终结器关联的操作3358 www 用于实现用于实现:的抽象表达式子类方法中的非终结符的操作TerminalExpression(终结符表达式):通常调用每个解释器所需的数据或通用功能NonterminalExpression(非终结符表达式):解释器
-主要包含解释器方法TerminalExpression和NonterminalExpression实现AbstractExpression所需的称为接口的interpret ()方法
-方法中的每个终结器都有一个特定的终端表达式
-方法中的每个规则都需要相应的具体NonterminalExpression
-例如,R=R1 R2中; R1/R2是终结器,R1/R2的解释器是终端表达式,而“解释为非终结符”的解释器是与NonterminalExpressionContext存储方法中每个终结器对应的具体解释器
-例如,R=R1 R2中; 给R1分配100,给R2分配200。 这些信息必须保存在上下文中
-通常用于传递所有解释器共享的数据,后面的解释器可以从中获取特定的数据
-在大多数情况下,通过将Map用作上下文,客户端将要分析的语句或表达式转换为使用解释器对象编写的抽象语法树,然后调用解释器方法
-也可通过上下文间接地访问解释器的解释方法Comsequences_结果8的优点
可扩展性和灵活性
添加了新的表达式解释方法
容易实现简单方法的缺点
可用场景很少
复杂的语法很难维持
解释器模式引起类的膨胀
解释模式采用递归调用方法的用途
可以将需要解释执行的语言的句子表示为抽象语法树
重复出现的几个问题可以用简单的语言来表达
需要说明简单语法的场景Implementation/Sample Code_实现/示例代码910 implementation 3358 www.Sina.com /
publicabstractclassabstractexpression {/* * *处理解释* */publicabstractvoidinterpret (context CTX ); } Context(环境)
将publicclasstermianlexpressionextendsabstractexpression { public void interpret (context CTX )//语法规则终止符相关的解释操作//todo}
publicclassnonterminalexpressionextendsabstractexpression { privatelistabstractexpressionlist=newarraylistabstractexpression } public void interpret (context CTX ) /与语法规则的非终结符相关的解释操作///todo ) http://www.Sina.com/
公共类别上下文(/公共属性方法) } Client(客户)
public class Client {//step1:根据语法规则针对特定的句子构建抽象语法树//step2:调用解释操作} Sample C
odeExpression
public abstract class AbstractExpression { public abstract boolean interpret(String context);}TerminalExpression
public class TerminalExpression extends AbstractExpression { private Set<String> set = new HashSet<String>(); public TerminalExpression(String[] data) { for (int i = 0; i < data.length; i++) { set.add(data[i]); } }// 处理终结符表达式 @Override public boolean interpret(String context) { if (set.contains(context.trim())) { return true; } return false; }}NonterminalExpression
public class AndExpression extends AbstractExpression { private AbstractExpression consoles = null; private AbstractExpression games = null; public AndExpression(AbstractExpression consoles, AbstractExpression games) { this.consoles = consoles; this.games = games; }// 处理非终结符表达式 @Override public boolean interpret(String context) { String s[] = context.split("on"); return games.interpret(s[0]) && consoles.interpret(s[1]); }}Context
public class Context { private String[] consoles = {"PC", "PS4", "XBOX"}; private String[] games = {"Halo", "SEKIRO", "Diablo"}; private AbstractExpression expression = null; public Context() { expression = new AndExpression(new TerminalExpression(consoles), new TerminalExpression(games)); }// 调用相关表达式类的解释方法 public void play(String context) { boolean flag = expression.interpret(context); if (flag) { System.out.println("Now you can play " + context); } else { System.out.println("There is no such game to paly"); } }}Client
public class Client { public static void main(String[] args) { Context game = new Context(); game.play("Diablo on PS4"); game.play("Diablo on XBOX"); game.play("XCOM on PC"); }}Result
Now you can play Diablo on PS4Now you can play Diablo on XBOXThere is no such game to paly Known Uses_已知应用11 Related Patterns_相关模式12模式分类归属 ↩︎
意图:描述该模式的作用,以及该模式的定义 ↩︎
动机:给出了问题以及如何解决这个问题的具体场景 ↩︎
适用性:描述模式可以被应用在什么场合 ↩︎
结构:提供了图示,显示出参与此模式的类之间的关系 ↩︎
参与者:描述在此设计中所涉及到的类和对象在模式中的责任和角色 ↩︎
协作 :告诉参与者如何在此模式中合作 ↩︎
结果:描述采用此模式之后可能产生的效果,好的与不好的 ↩︎
实现:提供了在实现该模式时需要使用的技巧,以及应该小心面对的问题 ↩︎
范例代码:提供代码的片段 ↩︎
已知应用:用来描述已经在真实系统中发现的模式例子 ↩︎
相关模式:描述了此模式和其他模式之间的关系 ↩︎