设计模式-解释器模式



解释器模式属于行为型模式

解释器模式实现一个表达式接口,该接口解释一个特定的上下文,
让计算机按照我们的解释去执行。

包含抽象解释器、终结符表达式、非终结符表达式、上下文四个角色。

终结符表达式:不依赖其它解释器,就比如运算数;
非终结符表达式:依赖其它解释器才有意义,比如运算符;

对于a+b,a、b是运算数,+是运算符。

上下文

上下文其实就是环境,这里我们用map替代

抽象解释器-表达式接口

AbstractExpression

package com.example.duohoob.dp.interpreter;

import java.util.Map;

/**
 * 抽象解释器-表达式接口
 * @Title: AbstractExpression.java
 * @Package com.example.duohoob.dp.interpreter
 *
 * @author yangwei
 * @date 2022年7月13日
 */
public interface AbstractExpression {

	/**
	 * 这就是解释
	 * @author yangwei
	 * @date 2022年7月13日
	 *
	 * @param context 上下文、就是环境,这里我们用map
	 * @return
	 */
	int interpreter(Map<String, Integer> context);
	
}

终结符解释器-解释运算数

OperandExpression

package com.example.duohoob.dp.interpreter;

import java.util.Map;

/**
 * 终结符解释器-解释运算数
 * @Title: OperandExpression.java
 * @Package com.example.duohoob.dp.interpreter
 *
 * @author yangwei
 * @date 2022年7月13日
 */
public class OperandExpression implements AbstractExpression {

	/**
	 * 变量名
	 */
	private String key;
	
	public OperandExpression(String key) {
		this.key = key;
	}
	
	@Override
	public int interpreter(Map<String, Integer> context) {
		// TODO Auto-generated method stub
		if (context.containsKey(key)) {
			return context.get(key);
		}
		return 0;
	}
	
}

非终结符解释器-解释运算符

OperatorExpression

package com.example.duohoob.dp.interpreter;

/**
 * 非终结符解释器-解释运算符
 * @Title: OperatorExpression.java
 * @Package com.example.duohoob.dp.interpreter
 *
 * @author yangwei
 * @date 2022年7月13日
 */
public abstract class OperatorExpression implements AbstractExpression {

	protected OperandExpression left;
	
	protected OperandExpression right;

	/**
	 * 每个运算符号都需要有左右两个操作数
	 * @param left
	 * @param right
	 */
	public OperatorExpression(OperandExpression left, OperandExpression right) {
		this.left = left;
		this.right = right;
	}
	
}

具体解释器-加法解释器

AdditionExpression
package com.example.duohoob.dp.interpreter;

import java.util.Map;

/**
 * 具体解释器-加法解释器
 * @Title: AdditionExpression.java
 * @Package com.example.duohoob.dp.interpreter
 *
 * @author yangwei
 * @date 2022年7月13日
 */
public class AdditionExpression extends OperatorExpression {

	public AdditionExpression(OperandExpression left, OperandExpression right) {
		super(left, right);
	}

	/**
	 * 加法
	 * @author yangwei
	 * @date 2022年7月13日
	 *
	 * @param context
	 * @return
	 */
	@Override
	public int interpreter(Map<String, Integer> context) {
		// TODO Auto-generated method stub
		return left.interpreter(context) + right.interpreter(context);
	}

}

测试a+b

package com.example.duohoob.dp.interpreter;

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

/**
 * @Title: InterpreterTest.java
 * @Package com.example.duohoob.dp.interpreter
 *
 * @author yangwei
 * @date 2022年7月13日
 */
public class InterpreterTest {

	/**
	 * 实现a+b
	 * @author yangwei
	 * @date 2022年7月13日
	 *
	 * @param args
	 */
	public static void main(String[] args) {
		// 上下文环境
		Map<String, Integer> context = new HashMap<String, Integer>();
		context.put("a", 1);
		context.put("b", 2);
		
		// 运算数、终结符表达式
		OperandExpression left = new OperandExpression("a");
		OperandExpression right = new OperandExpression("b");
		
		// 运算符、非终结符表达式
		AdditionExpression addition = new AdditionExpression(left, right);
		
		// 让计算机执行加法
		int sum = addition.interpreter(context);
		System.out.println("a + b = " + sum);
	}
	
}

运行
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值