設計模式(Java隨筆)—直譯器模式
阿新 • • 發佈:2018-12-19
直譯器模式(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):包含直譯器之外的一些全域性資訊。
應用:
- 正則表示式,瀏覽器等
- 這種模式一般會應用到一些特殊的問題上,使用這種模式一般需要了解形式語言中的基本知識。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; } }
執行結果:
終端直譯器
非終端直譯器
參考資料:
《大話設計模式》——程傑