优点
- 解释器模式是一种类行为型模式,其主要优点如下。
扩展性好。由于在解释器模式中使用类来表示语言的文法规则,因此可以通过继承等机制来改变或扩展文法。
容易实现。在语法树中的每个表达式节点类都是相似的,所以实现其文法较为容易。
缺点
- 解释器模式的主要缺点如下。
执行效率较低。解释器模式中通常使用大量的循环和递归调用,当要解释的句子较复杂时,其运行速度很慢,且代码的调试过程也比较麻烦。
会引起类膨胀。解释器模式中的每条规则至少需要定义一个类,当包含的文法规则很多时,类的个数将急剧增加,导致系统难以管理与维护。
可应用的场景比较少。在软件开发中,需要定义语言文法的应用实例非常少,所以这种模式很少被使用到。
代码
public interface Expression
{
public boolean interpret(String info);
}
public class TerminalExpression implements Expression
{
public Set<String> interpretSet = new HashSet<>();
@Override
public boolean interpret(String info)
{
if(interpretSet.contains(info))
return true;
else
return false;
}
public void inject(String[] newInfos){
if(newInfos!=null)
{
for(String var1 : newInfos)
{
interpretSet.add(var1);
}
}
}
}
public class AndExpression implements Expression
{
Expression city=null;
Expression person=null;
public AndExpression(Expression city,Expression person){
this.city=city;
this.person=person;
}
@Override
public boolean interpret(String info)
{
String[] var1 = info.split("的");
return city.interpret(var1[0])&&person.interpret(var1[1]);
}
}
public class Context
{
private String[] citys={"韶关","广州"};
private String[] persons={"老人","妇女","儿童"};
private Expression andExpression;
public Context(){
Expression city = new TerminalExpression();
Expression person = new TerminalExpression();
((TerminalExpression) city).inject(citys);
((TerminalExpression) person).inject(persons);
andExpression = new AndExpression(city, person);
}
public String freeRide(String info){
boolean ok = andExpression.interpret(info);
if(ok)
return "你是"+info+"本次免费";
return info+",您不是免费人员,本次乘车扣费2元!";
}
}
public class Demo06
{
public static void main(String[] args)
{
Context context = new Context();
String var1 = context.freeRide("广州的年轻人");
System.out.println(var1);
}
}
广州的年轻人,您不是免费人员,本次乘车扣费2元!
网友评论