解释器模式定义:给分析对象定义一个语言,并定义该语言的文法表示,再设计一个解析器来解释语言中的句子。也就是说,用编译语言的方式来分析应用中的实例。这种模式实现了文法表达式处理的接口,该接口解释一个特定的上下文。(类行为型)

解释器模式与适配器模式这两个模式类似 , 但是略有不同:
- 适配器模式 : 不需要预先知道适配器的规则;
- 解释器模式 : 需要预先将规则写好 , 根据规则执行解释。
解释器模式主要角色如下:
用解释器模式设计一个“韶粵通”公交车卡的读卡器程序。
说明:假如“韶粵通”公交车读卡器可以判断乘客的身份,如果是“韶关”或者“广州”的“老人” “妇女”“儿童”就可以免费乘车,其他人员乘车一次扣 2 元。
文法规则如下: <expression> ::= <city>的<person> <city> ::= 韶关|广州 <person> ::= 老人|妇女|儿童
- package interpreter.buscard;
- //抽象表达式类
- public interface IExpression{
- public boolean interpret(String info);
- }
- package interpreter.buscard;
- import java.util.HashSet;
- import java.util.Set;
- //终结符表达式类
- public class TerminalExp implements IExpression {
- private Set
set = new HashSet<>(); - public TerminalExp(String[] data) {
- for (int i = 0; i < data.length; i++){
- set.add(data[i]);
- }
- }
- @Override
- public boolean interpret(String info) {
- // TODO Auto-generated method stub
- if (set.contains(info)){
- return true;
- }
- return false;
- }
-
- }
- package interpreter.buscard;
- //非终结符表达式类
- public class AndExpression implements IExpression {
-
- private IExpression city = null;
- private IExpression person = null;
-
- public AndExpression(IExpression city, IExpression person) {
- this.city = city;
- this.person = person;
- }
-
- @Override
- public boolean interpret(String info) {
- // TODO Auto-generated method stub
- String[] s = info.split("的");
- return city.interpret(s[0]) && person.interpret(s[1]);
- }
-
- }
- package interpreter.buscard;
- //环境类
- public class Context {
- private String[] cities = {"韶关","广州"};
- private String[] persons = {"老人","妇女","儿童"};
- private IExpression cityPerson;
-
- public Context() {
- IExpression city = new TerminalExp(cities);
- IExpression person = new TerminalExp(persons);
- cityPerson = new AndExpression(city,person);
- }
-
- public void freeRide(String info){
- boolean ok = cityPerson.interpret(info);
- if (ok){
- System.out.println("您是"+info+",您本次乘车免费!");
- }else {
- System.out.println(info+",您不是免费人员,本次乘车扣费2元!");
- }
- }
- }
- package interpreter.buscard;
-
- public class Test {
-
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- Context bus = new Context();
- bus.freeRide("韶关的老人");
- bus.freeRide("韶关的年轻人");
- bus.freeRide("广州的妇女");
- bus.freeRide("广州的儿童");
- bus.freeRide("山东的儿童");
- }
-
- }

