1. 程式人生 > >設計模式(Java隨筆)—直譯器模式

設計模式(Java隨筆)—直譯器模式

直譯器模式(Interpreter Pattern):很少用到的一個模式,主要因為該模式的實現特別複雜且應用場景較少,所以很少人使用,當有一個簡單的語言需要解釋執行,並且可以將該語言的每一個規則表示為一個類時,就可以使用直譯器模式

Given a language,define a representation for its grammar along with an interpreter that uses the representation to interpret sentences in the language.

給定一個語言,定義它的文法的一種表示,並定義一個直譯器,這個直譯器使用該表示來解釋語言中的句子。

 直譯器模式四種角色(還有一個客戶端角色):

  •     抽象表示式:該角色為一個介面,負責定義抽象的解釋操作。
  •     終結符表示式:實現抽象表示式介面的類。
  •     非終結表示式:也是實現抽象表示式的類。
  •     上下文(Context):包含直譯器之外的一些全域性資訊。

應用:

  1. 正則表示式,瀏覽器等
  2. 這種模式一般會應用到一些特殊的問題上,使用這種模式一般需要了解形式語言中的基本知識。js核心就是一個強大的直譯器。

注:直譯器模式的例項特殊,且用途極少,只記錄基礎程式碼的實現,瞭解該模式的思想即可,等到以後用到的時候再學習

直譯器模式基礎程式碼實現:

import java.util.ArrayList;
import java.util.List;

public class InterpreterModel {
	/*
	 * 直譯器模式
	 */
	public static void main(String[] args) {
		Contex context=new Contex();
		List<Expression> list=new ArrayList<Expression>();
		list.add(new TerminalExpression());
		list.add(new NonterminalExpression());
		for(Expression e:list) {
			e.Interpret(context);
		}
	}
}

//抽象表示式
abstract class Expression{
	public abstract void Interpret(Contex context);
}

//終結符表示式
class TerminalExpression extends Expression{
	@Override
	public void Interpret(Contex context) {
		System.out.println("終端直譯器");
	}
}
//非終結符表示式
class NonterminalExpression extends Expression{
	@Override
	public void Interpret(Contex context) {
		System.out.println("非終端直譯器");
	}
}

//環境角色Context
class Contex{
	private String input;
	private String output;
	public String getInput() {
		return input;
	}
	public void setInput(String input) {
		this.input = input;
	}
	public String getOutput() {
		return output;
	}
	public void setOutput(String output) {
		this.output = output;
	}
}

執行結果:

終端直譯器
非終端直譯器

參考資料:

《大話設計模式》——程傑