解释器模式
解释器模式(Interpreter pattern)给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。典型的代表为正则表达式。
解释器的作用在于,有一个大家都知道的说话规则,那么如果你说的话按照这个语法或则规则,我皆可以知道你这句话是什么意思,如在不同的语言地区,人们使用了不同的语言,不懂得这个语言发音规则以及音节代表的是什么,你就听不懂,如果别人知道就能听的懂。
实现解释器有下面几步,
1.定义一个解释器接口,
public abstract class AbstractExpression {
public abstract boolean interpreter(String context);
}
2.实现具体的语法:
public class TELLengthExpression extends AbstractExpression{
private int TelNumLength;
public TELLengthExpression(int TelNumLength) {
this.TelNumLength = TelNumLength;
}
@Override
public boolean interpreter(String context) {
if (context.length() == TelNumLength) {
return true;
}
return false;
}
}
这是一个判断长度是否正确的解释器。
public class TelNumCheck extends AbstractExpression{
public TelNumCheck() {
}
@Override
public boolean interpreter(String context) {
if (context.substring(0, 1).equals("1")) {
return true;
}
return false;
}
}
这是一个判断是开始字母为1的解释器。
public class TelNoCheck extends AbstractExpression{
private TELLengthExpression lengthExpression;
private TelNumCheck numCheck;
public TelNoCheck() {
lengthExpression = new TELLengthExpression(11);
numCheck = new TelNumCheck();
}
@Override
public boolean interpreter(String context) {
if (numCheck.interpreter(context) && lengthExpression.interpreter(context)) {
return true;
}
return false;
}
}
这是一个将长度判断和首字母为1判断与操作的解释器。
3.使用解释器
public class InterpreterDemo {
public static void main(String[] args) {
String telNo = "13823457899";
String telNo1 = "1346789234";
TelNoCheck telNoCheck = new TelNoCheck();
boolean isTel = telNoCheck.interpreter(telNo);
boolean isTel1 = telNoCheck.interpreter(telNo1);
System.out.println(telNo+"is Tel Number:"+isTel);
System.out.println(telNo1+"is Tel Number:"+isTel1);
}
输出结果
13823457899is Tel Number:true
1346789234is Tel Number:false