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

时间:2022-11-02 17:07:29

解释器模式作用:

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


应用场景:

(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{

@Override
void interpret(Context ctx) {
// TODO Auto-generated method stub
System.out.println("高级解析器");
}

}

普通解释器

package com.lanhuigu.base.design.behavior.interpreter;
/**
* Expression:实现与文法中的元素相关联的解释操作
*/
public class SimpleExpression extends Expression {

@Override
void interpret(Context ctx) {
// TODO Auto-generated method stub
System.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);
}
}
}

运行结果:

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