尚硅谷设计模式学习(21)---[解释器模式(Interpreter Pattern)]

Posted 小智RE0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了尚硅谷设计模式学习(21)---[解释器模式(Interpreter Pattern)]相关的知识,希望对你有一定的参考价值。

尚硅谷传送门==>B站尚硅谷Java设计模式

❤❤❤感谢尚硅谷❤❤❤

最近开始计划学习一下设计模式了,加油!!!


解释器模式

给定语言(表达式),定义它的表示,并定义解释器,使用该解释器来解释语言中的句子(表达式).

Context可以包含解释器之外的其他数据信息.

缺点:解释器模式会引起类膨胀;采用递归调用方法,将会导致调试非常复杂;效率降低


简易计算器案例

抽象的表达式类AbstractExpression

/**
 * @author by CSDN@小智RE0
 */

//抽象表达式;
public abstract class AbstractExpression {
    //解释;  公式的键值;
    public abstract int interpret(HashMap<String,Integer> varEle);
}

变量表达式TerminalExpression

/**
 * @author by CSDN@小智RE0
 */

//终结表达式;   变量表达式
public class TerminalExpression extends AbstractExpression {
    //公式的参数;例如a,b,c,d,e;
    private String varKey;

    //初始化;
    public TerminalExpression(String varKey) {
        this.varKey = varKey;
    }

    //获取到存入变量对应的数值;
    @Override
    public int interpret(HashMap<String, Integer> varEle) {
        return varEle.get(this.varKey);
    }
}

字符表达式NoTerminalExpression

/**
 * @author by CSDN@小智RE0
 */

//非终结表达式;   符号表达式;
public class NoTerminalExpression extends AbstractExpression{

    //每个运算符号两边都有数值;
    protected AbstractExpression left;
    protected AbstractExpression right;

    //初始化;
    public NoTerminalExpression(AbstractExpression left, AbstractExpression right) {
        this.left = left;
        this.right = right;
    }


    //这里是空实现,具体的让子类,加法/减法表达式去做;
    @Override
    public int interpret(HashMap<String, Integer> varEle) {
        return 0;
    }
}

加法字符的运算表达式AddExpression

/**
 * @author by CSDN@小智RE0
 */

//加法表达式;
public class AddExpression extends NoTerminalExpression{
    //初始化
    public AddExpression(AbstractExpression left, AbstractExpression right) {
        super(left, right);
    }

    //加法解释;  让左右两边的数值相加;
    @Override
    public int interpret(HashMap<String, Integer> varEle) {
        return super.left.interpret(varEle) + super.right.interpret(varEle);
    }
}

减法字符的运算表达式RemoveExpression

/**
 * @author by CSDN@小智RE0
 */
//减法表达式
public class RemoveExpression extends NoTerminalExpression{

    //初始化;
    public RemoveExpression(AbstractExpression left, AbstractExpression right) {
        super(left, right);
    }

    //减法解释; 让两边的数值相减;
    @Override
    public int interpret(HashMap<String, Integer> varEle) {
        return super.left.interpret(varEle) - super.right.interpret(varEle);
    }
}

计算器Calculator

/**
 * @author by CSDN@小智RE0
 */

//计算器;
public class Calculator {
    //表达式;
    private AbstractExpression abstractExpression;

    public Calculator(String str) {
        //定义运算顺序;
        Stack<AbstractExpression> stack = new Stack<AbstractExpression>();
        char[] c = str.toCharArray();

        //左右符号;
        AbstractExpression left = null;
        AbstractExpression right = null;

        for (int i = 0; i < c.length; i++) {
            switch (c[i]){
                case '+':
                    //左边的数字先入栈;
                    left=stack.pop();
                    //右边的入栈;
                    right=new TerminalExpression(String.valueOf(c[++i]));
                    //出栈加法运算;
                    stack.push(new AddExpression(left,right));
                    break;
                case '-':
                    //左边的数字先入栈;
                    left=stack.pop();
                    //右边的入栈;
                    right=new TerminalExpression(String.valueOf(c[++i]));
                    //出栈减法运算;
                    stack.push(new RemoveExpression(left,right));
                    break;
                default:
                    //不是加减符号的,就是变量了,直接出栈,
                    stack.push(new TerminalExpression(String.valueOf(c[i])));
                    break;
            }
        }
        this.abstractExpression = stack.pop();
    }

    //运行计算;
    public int show(HashMap<String,Integer> var){
        System.out.print("计算结果为==>");
        return this.abstractExpression.interpret(var);
    }
}

模拟客户端Client

/**
 * @author by CSDN@小智RE0
 */
//客户端;
public class Client {

    //输入表达式
    public static String input() throws IOException {
        System.out.println("输入运算的式子-->");
        return (new BufferedReader(new InputStreamReader(System.in))).readLine();
    }

    //表达式存入map集合后;
    public static  HashMap<String ,Integer> toMap(String str) throws IOException {
        HashMap<String ,Integer> hashMap = new HashMap<String, Integer>();
        for (char ch : str.toCharArray()) {
            if (ch != '+' && ch != '-') {
                if (!hashMap.containsKey(String.valueOf(ch))) {
                    System.out.print("输入当前变量" + String.valueOf(ch) + "值==>");
                    //为单个变量赋值;
                    String in = (new BufferedReader(new InputStreamReader(System.in))).readLine();
                    hashMap.put(String.valueOf(ch), Integer.valueOf(in));
                }
            }
        }
        return hashMap;
    }


    public static void main(String[] args) throws IOException {
        //先获取输入的运算表达式;
        String str =input();
        HashMap<String, Integer> hashMap = toMap(str);
        //使用计算器;
        Calculator calculator = new Calculator(str);
        //得到计算结果;
        System.out.println(calculator.show(hashMap));
    }
}

测试输出

输入运算的式子-->
a+b+v-p+o
输入变量a值==>10
输入变量b值==>12
输入变量v值==>6
输入变量p值==>32
输入变量o值==>20
计算结果为==>16

以上是关于尚硅谷设计模式学习(21)---[解释器模式(Interpreter Pattern)]的主要内容,如果未能解决你的问题,请参考以下文章

尚硅谷设计模式学习---[装饰者模式]

尚硅谷设计模式学习---[单例模式]

尚硅谷设计模式学习---[桥接模式(Bridge)]

尚硅谷设计模式学习(23)---[策略模式(strategy pattern)]

尚硅谷设计模式学习---[简单工厂模式,工厂方法模式,抽象工厂模式]

尚硅谷设计模式学习(17)---[迭代器模式(Iterator Pattern)]