设计模式-解释器模式

About 2 minpattermjava interpreter

一、对解释器的理解

解释器就像翻译一样,将我们不认识的语言(简化的语言如o2o)翻译为我们认识的普通的语言。如果事物频繁的出现,但是比较复杂,不容易看懂。我们就可以把它表述为一个简单的事物,最用用一个解释器去解释简单的事物就可以了。

二、代码实现

创建表达式接口

// 创建一个表达式接口
public interface Expression {
	public boolean interpret(String content);  // 解释
}
        

终端表达式

// 终端表达式
public class TerminalExpression implements Expression{
	private String data;
	public TerminalExpression(String data){
		this.data = data;
	}
	@Override
	public boolean interpret(String content) {
		if (content.contains(data)) {  // 包含
			return true;
		}
		return false;
	}
}

与表达式

// 与表达式
public class OrExpression implements Expression{
	private Expression ex1;
	private Expression ex2;
	public OrExpression (Expression ex1, Expression ex2) {
		this.ex1 = ex1;
		this.ex2 = ex2;
	}
	@Override
	public boolean interpret(String content) {
		return this.ex1.interpret(content) || this.ex2.interpret(content);
	}
}

和表达式

// 和表达式
public class AndExpression implements Expression{
	private Expression ex1;
	private Expression ex2;
	public AndExpression(Expression ex1, Expression ex2) {
		this.ex1 = ex1;
		this.ex2 = ex2;
	}
	@Override
	public boolean interpret(String content) {
		return ex1.interpret(content) && ex2.interpret(content);
	}
}

解析器

// 解析器
public class Interpreter {
	// 获取男性表达式
	public static Expression getMaleExpression(){
		Expression wang = new TerminalExpression("小王");
		Expression zhang = new TerminalExpression("小张");
		return new OrExpression(wang,zhang);
	}
	// 获取女性表达式
	public static Expression getWomanExpression() {
		Expression wu = new TerminalExpression("小吴");
		Expression li = new TerminalExpression("小李");
		return new OrExpression(wu,li);
	}
}

main方法实现

public static void main(String[] args) {
		Expression isMale = Interpreter.getMaleExpression();
		Expression isWoman = Interpreter.getWomanExpression();
		System.out.println("小李是女的"+ isWoman.interpret("小李"));
		System.out.println("小王是男的"+ isMale.interpret("小王"));
		System.out.println("小王是男的"+ isMale.interpret("小李"));
	}

运行结果

小李是女的true
小王是男的true
小王是男的false

三、UML类图

interpreter

四、笔记

解释器模式的优点:

  • 将每一个语法规则表示成一个类,方便与实现语言.

  • 因为语法由多个类组成,因此你可以轻易的扩张语言.

  • 可以在新的类中增加新的方法,可以在解释的同时增加新的行为。

解释器的用途和缺点:

  • 当需要实现一个简单的语言的时候,可以使用解释器。

  • 当有一个简单的语法,简单比效率更重要是,使用解释器。

  • 可以处理脚本语言和编程语言

  • 如果语法规则数量太多,使用解释器模式可能会很复杂。这个时候可以使用解析器/编译器的产生器更合适。

Last update:
Contributors: gaoqisen