解释器模式
相关概念:
- 抽象表达式(Abstract Expression)角色:定义解释器的接口,约定解释器的解释操作,主要包含解释方法 interpret()。
- 终结符表达式(Terminal Expression)角色:是抽象表达式的子类,用来实现文法中与终结符相关的操作,文法中的每一个终结符都有一个具体终结表达式与之相对应。
- 非终结符表达式(Nonterminal Expression)角色:也是抽象表达式的子类,用来实现文法中与非终结符相关的操作,文法中的每条规则都对应于一个非终结符表达式。
- 环境(Context)角色:通常包含各个解释器需要的数据或是公共的功能,一般用来传递被所有解释器共享的数据,后面的解释器可以从这里获取这些值。
- 客户端(Client):主要任务是将需要分析的句子或表达式转换成使用解释器对象描述的抽象语法树,然后调用解释器的解释方法,当然也可以通过环境角色间接访问解释器的解释方法。
案例
给景区设计一个检票解释器,符合一定规则可以免票
public abstract class IDCardExpression {
abstract boolean interpret(String card);
}
public class MyExpression extends IDCardExpression{
Set<String> data;
String symbol;
public MyExpression(Set<String> data, String symbol) {
this.data = data;
this.symbol = symbol;
}
@Override
boolean interpret(String card) {
String[] split = card.split(symbol);
for(String s:split){
if (data.contains(s)) {
return true;
}
}
return false;
}
}
景区:
public class Area {
Set<String> city = new HashSet<>();
Set<String> type = new HashSet<>();
IDCardExpression cityReader;
IDCardExpression typeReader;
// "北京-张三:老人"
public Area(){
city.add("北京");
city.add("天津");
type.add("老人");
type.add("儿童");
cityReader = new MyExpression(city,"-");
typeReader = new MyExpression(type,":");
}
public void getTicket(String card){
boolean interpret1 = cityReader.interpret(card);
boolean interpret2 = typeReader.interpret(card);
if(interpret1 || interpret2){
System.out.println(card + ":免票成功");
}else{
System.out.println(card + ":对不起,不符合免票规则");
}
}
}
测试:
public class Main {
public static void main(String[] args) {
Area area = new Area();
String card1 = "北京-张三:老人";
String card2 = "成都-李四:成年人";
String card3 = "天津-王五:程序员";
area.getTicket(card1);
area.getTicket(card2);
area.getTicket(card3);
}
}