设计模式-行为型之解释器模式

本文深入介绍了解释器模式的概念、结构及应用案例。解释器模式定义了一种语言的文法,并建立了解释器来解释该语言中的句子。文章通过具体代码示例展示了如何使用解释器模式来解决字符串匹配等问题。

模式动机

  如果在系统中某一特定类型的问题发生的频率很高,此时可以考虑将这些问题的实例表述为一个“语言”中的“句子”,可以构建一个解释器,该解释器通过解释这些“句子”来解决这些问题。比如我们需要经常进行字符串的匹配,我们可以把这种匹配算法定义为一种“语言”,说到这里,你应该明白了,我指的这种“语言”正是我们的正则表达式,而一个具体的正则表达式如“/^\d{4}$/”则是我们的“句子”,我们通过解析这个“句子”来解决我们的字符串匹配问题。负责解析这个“句子”的叫做解释器。

模式定义

  解释器模式:定义语言的文法,并且建立一个解释器来解释该语言中的句子,这里的“语言”意思是使用规定格式和语法的代码。

模式结构

模式结构
  抽象表达式:AbstractExpression,定义一个抽象的解释操作
  终结符表达式:TerminalExpression,对终结符进行解释操作
  非终结符表达式:NonterminalExpression,对非终结符进行解释操作
  环境类 : Context,包含解释器之外的一些全局信息

代码示例

//抽象表达式
public abstract class AbstractExpression {
    public abstract int interpreter(Context context);
}
//非终结符表达式-减法运算符
public class MinusExpression extends AbstractExpression{
    private AbstractExpression left;
    private AbstractExpression right;
    public MinusExpression(AbstractExpression left,AbstractExpression right){
        this.left = left;
        this.right = right;
    }
    @Override
    public int interpreter(Context context) {
        return left.interpreter(context) - right.interpreter(context);
    }
}
//非终结符表达式-加法运算符
public class PlusExpression extends AbstractExpression{
    private AbstractExpression left;
    private AbstractExpression right;
    public PlusExpression(AbstractExpression left,AbstractExpression right){
        this.left = left;
        this.right = right;
    }
    @Override
    public int interpreter(Context context) {
        return left.interpreter(context) + right.interpreter(context);
    }
}
//终结符表达式-变量值
public class ValueExpression extends AbstractExpression{
    private int value;
    public ValueExpression(int value){
        this.value = value;
    }
    @Override
    public int interpreter(Context context) {
        return value;
    }
}
import java.util.HashMap;
import java.util.Map;
//环境类
public class Context {
    private Map<String, Integer> map = new HashMap<String, Integer>();
    public void addValue(String key,int value) {
        map.put(key, Integer.valueOf(value));
    }
    public int getValue(String key) {
        return map.get(key).intValue();
    }
}
//客户端测试
import java.util.HashMap;
import java.util.Map;
public class Client {
    public static void main(String[] args) {
        Context context = new Context();
        Map<String,Integer> map = new HashMap<String,Integer>();
        map.put("a", 1);
        map.put("b", 2);
        map.put("c", 3);
        //a+b
        PlusExpression expression1 = new PlusExpression(new ValueExpression(map.get("a")), new ValueExpression(map.get("b")));
        int result1 = expression1.interpreter(context);
        System.out.println(result1);//3
        //a+b-c
        MinusExpression expression2 = new MinusExpression(expression1, new ValueExpression(map.get("c")));
        int result2 = expression2.interpreter(context);
        System.out.println(result2);//0
    }
}

总结

  解释器模式主要包含如下四个角色:在抽象表达式中声明了抽象的解释操作,它是所有的终结符表达式和非终结符表达式的公共父类;终结符表达式是抽象表达式的子类,它实现了与文法中的终结符相关联的解释操作;非终结符表达式也是抽象表达式的子类,它实现了文法中非终结符的解释操作;环境类又称为上下文类,它用于存储解释器之外的一些全局信息。
  解释器模式的主要优点包括易于改变和扩展文法,易于实现文法并增加了新的解释表达式的方式;其主要缺点是对于复杂文法难以维护,执行效率较低且应用场景很有限。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值