1.定义
给定一个语言,定义它的语法表示,并使用一个解释器来解释语法或表达式
2.使用场景及设计
2.1.使用场景
可以用于sql解析,或者特殊符号处理等
2.2.设计
此处设计一个and语法解析器,类图如下:
3.测试代码
package com.glt.designpattern.interpreter;
public class InitMain {
public static void main(String[] args) {
VarExpression mail = new VarExpression("mail");
VarExpression phone = new VarExpression("phone");
AndExpression andExpression = new AndExpression(mail, phone);
boolean b = andExpression.interpret("this contarin mail and phone");
System.out.println(b);
}
}
package com.glt.designpattern.interpreter;
/**
* 表达式接口
*/
public interface Expression {
public boolean interpret(String data);
}
package com.glt.designpattern.interpreter;
/**
* 基础表达式
*/
public class VarExpression implements Expression {
private String exp;
public VarExpression(String exp) {
this.exp = exp;
}
@Override
public boolean interpret(String con) {
return con.contains(this.exp);
}
}
package com.glt.designpattern.interpreter;
/**
* And语法类
*/
public class AndExpression implements Expression {
private VarExpression exp1;
private VarExpression exp2;
public AndExpression(VarExpression str1, VarExpression str2) {
this.exp1 = str1;
this.exp2 = str2;
}
@Override
public boolean interpret(String data) {
return exp1.interpret(data) && exp2.interpret(data);
}
}
输出结果
true
Process finished with exit code 0
4.总结
优点:
- 每一个语法规则标识一个类
- 方便实现语言 因为一个语法由一个类表示,因此可以轻易的改变或者扩展新的语法规则
- 可以在类中加入新的方法来增加新的行为
缺点:
可使用场景较少,如果用上此设计模式一般内容都会比较复杂,像java中语法树等。