解释器模式(Interpreter)(类行为型模式)

参考文档:

1.设计模式-可复用面向对象软件的基础

2.http://www.cnblogs.com/itTeacher/archive/2012/12/12/2814437.html(Java设计模式十四:解释器模式(Interpreter))


解释器模式(Interpreter)(类行为型模式)

理论方面的知识可以参考 参考文档。

看一下Interpreter的结构:


代码实现:

Context.java:
package com.rick.designpattern.interpreter;

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

/**
 * Created by MyPC on 2017/6/30.
 */
public class Context {
    private Map<String, Integer> valueMap = new HashMap<String, Integer>();

    public void addValue(String key, int value) {
        valueMap.put(key, Integer.valueOf(value));
    }

    public int getValue(String key) {
        return valueMap.get(key).intValue();
    }

}
AbstractExpression.java:
package com.rick.designpattern.interpreter;

/**
 * Created by MyPC on 2017/6/30.
 */
public abstract class AbstractExpression {
    public abstract int interpreter(Context context);
}
AddNonterminalExpression.java:
package com.rick.designpattern.interpreter;

/**
 * Created by MyPC on 2017/6/30.
 */
public class AddNonterminalExpression extends AbstractExpression {
    private AbstractExpression left, right;

    public AddNonterminalExpression(AbstractExpression left, AbstractExpression right) {
        this.left = left;
        this.right = right;
    }

    @Override
    public int interpreter(Context context) {
        return this.left.interpreter(context) + this.right.interpreter(context);
    }
}
DivisionNonterminalExpression.java:
package com.rick.designpattern.interpreter;

/**
 * Created by MyPC on 2017/6/30.
 */
public class DivisionNonterminalExpression extends AbstractExpression {
    private AbstractExpression left, right;

    public DivisionNonterminalExpression(AbstractExpression left, AbstractExpression right) {
        this.left = left;
        this.right = right;
    }

    @Override
    public int interpreter(Context context) {
        int value = this.right.interpreter(context);
        if (value != 0) {
            return this.left.interpreter(context) / value;
        }
        return -1111;
    }
}
MultiplyNonterminalExpression.java:
package com.rick.designpattern.interpreter;

/**
 * Created by MyPC on 2017/6/30.
 */
public class MultiplyNonterminalExpression extends AbstractExpression {
    private AbstractExpression left, right;

    public MultiplyNonterminalExpression(AbstractExpression left, AbstractExpression right) {
        this.left = left;
        this.right = right;
    }

    @Override
    public int interpreter(Context context) {
        return this.left.interpreter(context) * this.right.interpreter(context);
    }
}
TerminalExpression.java:
package com.rick.designpattern.interpreter;

/**
 * Created by MyPC on 2017/6/30.
 */
public class TerminalExpression extends AbstractExpression {
    private int i;

    public TerminalExpression(int i) {
        this.i = i;
    }

    @Override
    public int interpreter(Context context) {
        return this.i;
    }
}
Client.java:
package com.rick.designpattern.interpreter;

/**
 * Created by MyPC on 2017/6/30.
 */
public class Client {


    public static void main(String[] args) {
        Context context = new Context();
        context.addValue("a", 5);
        context.addValue("b", 4);
        context.addValue("c", 3);
        context.addValue("d", 2);

        AbstractExpression abstractExpression = new AddNonterminalExpression(
                new TerminalExpression(context.getValue("a")), new TerminalExpression(context.getValue("b")));
        System.out.println(abstractExpression.interpreter(context));
        AbstractExpression abstractExpression2 = new DivisionNonterminalExpression(
                new TerminalExpression(context.getValue("a")), new TerminalExpression(context.getValue("b")));
        System.out.println(abstractExpression2.interpreter(context));
        AbstractExpression abstractExpression3 = new MultiplyNonterminalExpression(
                new TerminalExpression(context.getValue("a")), new TerminalExpression(context.getValue("b")));
        System.out.println(abstractExpression3.interpreter(context));
        AbstractExpression abstractExpression4 = new SubtractNonterminalExpression(
                new TerminalExpression(context.getValue("a")), new TerminalExpression(context.getValue("b")));
        System.out.println(abstractExpression4.interpreter(context));
    }

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值