设计模式(15)------解释器模式

来源:互联网 发布:男子遭遇网络诈骗 编辑:程序博客网 时间:2024/06/05 07:56

解释器模式作用:

给定一种语言,定义他的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中句子。


应用场景:

(1)有一个简单的语法规则,比如一个sql语句,如果我们需要根据sql语句进行rm转换,就可以使用解释器模式来对语句进行解释。


参与对象:

(1)AbstractExpression(抽象表达式)

声明一个所有具体表达式都要实现的抽象接口(或者抽象类),接口中主要是一个interpret()方法,称为解释操作。

(2)TerminalExpression(终结符表达式)

实现与文法中的元素相关联的解释操作,通常一个解释器模式中只有一个终结符表达式,对应一个实例。

(3)NonterminalExpression(非终结符表达式)

为文法中的非终结符实现解释(interpret)操作。

(4)Context(上下文)

包含解释器之外的一些全局信息。

(5)Client(客户端)

调用解释器。


eg:

AbstractExpression

package com.lanhuigu.base.design.behavior.interpreter;/** * AbstractExpression: 声明一个所有具体表达式都要实现的抽象接口(或者抽象类), * 接口中主要是一个interpret()方法,称为解释操作 */public abstract class Expression {abstract void interpret(Context ctx);}

Expression

高级解释器

package com.lanhuigu.base.design.behavior.interpreter;/** * Expression:实现与文法中的元素相关联的解释操作 */public class AdvanceExpression extends Expression{@Overridevoid interpret(Context ctx) {// TODO Auto-generated method stubSystem.out.println("高级解析器");}}

普通解释器

package com.lanhuigu.base.design.behavior.interpreter;/** * Expression:实现与文法中的元素相关联的解释操作 */public class SimpleExpression extends Expression {@Overridevoid interpret(Context ctx) {// TODO Auto-generated method stubSystem.out.println("普通解释器");}}

Context

package com.lanhuigu.base.design.behavior.interpreter;import java.util.ArrayList;import java.util.List;/** *  * Context: 包含解释器之外的一些全局信息 */public class Context {private String context;private List list  = new ArrayList();public String getContext() {return context;}public void setContext(String context) {this.context = context;}public List getList() {return list;}public void setList(List list) {this.list = list;}public void add(Expression eps) {list.add(eps);}}

Client

package com.lanhuigu.base.design.behavior.interpreter;/** * Client: 调用解释器 */public class Test {public static void main(String[] args) {Context ctx = new Context();ctx.add(new SimpleExpression());ctx.add(new AdvanceExpression());ctx.add(new SimpleExpression());for (int i=0;i<ctx.getList().size();i++) {Expression eps = (Expression) ctx.getList().get(i);eps.interpret(ctx);}}}

运行结果:



0 0