Java设计模式_行为型_解释器模式_加减法的运算

转载请注明出处:http://blog.csdn.net/ljmingcom304/article/details/50418812
本文出自:【梁敬明的博客】

1.变量的映射

  x是一个变量,y也是一个变量,x可以为任何值,y也可以为任何值。因此,每个变量都可以对应一个具体的值,通过上下文可以承载这样的映射关系。

public class Context {

    private Map map = new HashMap();

    // 为变量赋值
    public void addValue(Variable variable, Integer value) {
        map.put(variable, value);
    }

    // 获取变量值
    public Integer lookup(Variable variable) {
        return map.get(variable).intValue();
    }

}

2.获取计算结果

  无论是变量还是表达式,都能获得一个结果,我们通过一个解释器来获取最终的结果。

//解释器
public abstract class Expression {
    //获取一个正确的结果
    public abstract int interpret(Context context);
}

3.获取变量值

  若是一个变量,那么从上下文中去寻找变量对应的值。

//变量(终结符表达式)
public class Variable extends Expression {

    // 去上下文中查找变量的值
    @Override
    public int interpret(Context context) {
        return context.lookup(this);
    }

}

4.解析表达式

  若是一个表达式,那么去计算更简单表达式或去寻找变量对应的值,直到返回最终结果。

//加法运算(非终结符表达式)
public class Add extends Expression {

    private Expression left;
    private Expression 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);
    }

}

//减法(非终结符表达式)
public class Subtract extends Expression {

    private Expression left;
    private Expression right;

    // 若是变量就获取变量的值,若是表达式就向下求解
    public Subtract(Expression left, Expression right) {
        this.left = left;
        this.right = right;
    }

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

}

5.重温加减法

  一切都这么简单,重温一下小学的加法与减法运算。

public class Client {

public static void main(String[] args) {
    Context context = new Context();
    //变量
    Variable x = new Variable();
    Variable y = new Variable();

    context.addValue(x, 2);
    context.addValue(y, 6);

    //加减混合运算(x+y)-(x-y)
    Subtract subtract = new Subtract(new Add(x, y), new Subtract(x, y));

    System.out.println(subtract.interpret(context));
}

}

  

你可能感兴趣的:(设计模式)