设计模式——解释器模式

一、什么是解释器模式?

 

  解释器模式定义语言的语法,并建立解释器来解释语法中的句子。如正则表达式等的解释器。


  解释器模式涉及到以下几个角色:


  1. 抽象表达式角色:定义了具体的表达式需要实现的抽象解释方法或接口

  2. 具体表达式角色:指定了具体的表达式的解释

  3. 环境(Context)角色: 包含了解释器之外的一些全局信息

  4. 客户端角色:创建具体表达式并让解释器进行解释

 

二、解释器模式框图

 

以变量的加减法为例:


 

 

 

三、解释器模式的具体实现代码

 

3.1 Expression——抽象解释器

package designpatterns.interpreter;

/**
 * Created by Olive on 2017/12/27.
 * 抽象解释器
 */
public abstract class Expression {
    public abstract int interpret(Context context);
}

3.2 Variable、Add、Subtraction——具体的解释器,分别代表变量,加法和减法

package designpatterns.interpreter;

/**
 * Created by Olive on 2017/12/27.
 * 变量类,解释器方法返回此变量对应的值
 */
public class Variable extends Expression{

    @Override
    public int interpret(Context context) {
        return context.findValue(this);
    }
}

/**
 * Created by Olive on 2017/12/27.
 * 加法解释器
 */
public class Add extends Expression{

    private Expression left, right;

    public Add(Expression left, Expression right){
        this.left = left;
        this.right = right;
    }

    @Override
    public int interpret(Context context) {
        return left.interpret(context) + right.interpret(context);
    }
}

/**
 * Created by Olive on 2017/12/27.
 * 减法解释器
 */
public class Subtraction extends Expression{

    private Expression left, right;

    public Subtraction(Expression left, Expression right){
        this.left = left;
        this.right = right;
    }

    @Override
    public int interpret(Context context) {
        return left.interpret(context) - right.interpret(context);
    }
}

3.3 Context——环境角色,用HashMap储存变量以及对应的值

package designpatterns.interpreter;

import java.util.HashMap;
import java.util.Map;

/**
 * Created by Olive on 2017/12/27.
 * 环境角色,用HashMap储存变量以及对应的值
 */
public class Context {

    private Map<Variable, Integer> valueMap = new HashMap();

    public void addValue(Variable x, int y){
        valueMap.put(x, new Integer(y));
    }

    public int findValue(Variable x){
        int value = valueMap.get(x).intValue();
        return value;
    }
}

3.4 Client——客户端

package designpatterns.interpreter;

/**
 * Created by Olive on 2017/12/27.
 */
public class Client {

    public static void main(String[] args){

        Context context = new Context();

        // 设置变量
        Variable a = new Variable();
        Variable b = new Variable();
        Variable c = new Variable();

        // 为变量赋值
        context.addValue(a, 3);
        context.addValue(b, 2);
        context.addValue(c, 1);

        // 进行运算
        Expression expression = new Add(new Subtraction(a, c), b);
        System.out.println(expression.interpret(context));
    }
}

3.5 结果

4

Process finished with exit code 0

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值