ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

解释器模式

2019-05-29 17:48:56  阅读:192  来源: 互联网

标签:解释器 Expression 模式 context e1 public 表达式 e2


 * 解释模式:用得极其少:此处用一个加法和乘法例子说明:
 * 模式特点:一个表达式接口(Expression)和多个实现类,表达式接口有个解释的方法interpret();
 * 表达式接口的实现类分成2类: 非终结符表达式(NonterminalExpression),例如 加号就是非总结表达式,因为是一个过程
 * 终结符表达式(TerminalExpression):就是能取到具体指的表达表达式,如 5这个数字就是终结表达式,因为它不是一个过程
 * Context:上下文,用于存储终结表达式的值
 * 本例模拟实现加法和乘法的过程
 */

//抽象解释器(AbstractExpression)
public interface Expression {
    int interpret(Context context);
}
//终结表达式,获取具体值
public class NumberExpression implements Expression{
    private String name;

    public NumberExpression(String name) {
        this.name = name;
    }
    //通过名字在上下文获取具体的值
    @Override
    public int interpret(Context context) {
        return context.interpret(name);
    }
}
//非终结符表达式(NonterminalExpression) 乘法
public class MultipyEpression implements Expression{
    private Expression e1,e2; //e1,e2都是终结表达式

    public MultipyEpression(Expression e1, Expression e2) {
        this.e1 = e1;
        this.e2 = e2;
    }

    @Override
    public int interpret(Context context) {
        //乘法运算
        return this.e1.interpret(context)*this.e2.interpret(context);
    }
}
//非终结符表达式(NonterminalExpression) 加法
public class AddExpression implements Expression {
    private Expression e1,e2; //e1,e2都是终结表达式

    public AddExpression(Expression e1, Expression e2) {
        this.e1 = e1;
        this.e2 = e2;
    }

    @Override
    public int interpret(Context context) {
        //加法运算
        return this.e1.interpret(context)+this.e2.interpret(context);
    }
}
//上下文表达式
public class Context {
    private Map<String,Integer> map=new HashMap<>();
    //存储终结表达式的值
    public void addNum(String name,Integer num){
        if(null==map.get(name)){
            map.put(name,num);
        }
    }
    //获取终结表达式的值
    public int interpret(String name){
        return map.get(name);
    }
}
public class Test {
    public static void main(String[] args) {
        Context context = new Context();//上下文对象
        Expression e1 = new NumberExpression("e1"); //终结表达式
        Expression e2 = new NumberExpression("e2");//终结表达式
        Expression e3 = new NumberExpression("e3");//终结表达式
        context.addNum("e1",2);//给终结表达式 赋值
        context.addNum("e2",6);//给终结表达式 赋值
        context.addNum("e3",3);//给终结表达式 赋值
        //计算(2+6)*3
        MultipyEpression multipyEpression = new MultipyEpression(new AddExpression(e1, e2), e3);
        System.out.println(multipyEpression.interpret(context));//24
    }
}

 

标签:解释器,Expression,模式,context,e1,public,表达式,e2
来源: https://www.cnblogs.com/yangxiaohui227/p/10945268.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有