類型:行為型模式
實現(xiàn)原理:實現(xiàn)了一個表達式接口,該接口使用標(biāo)識來解釋語言中的句子
作用:給定一個語言,定義它的文法表示,并定義一個解釋器,這個解釋器來解釋。
主要解決:一些重復(fù)的固定文法分別創(chuàng)建解釋器會很麻煩
何時使用:某一種特定類型的問題發(fā)生的頻率足夠高
解決的方法:構(gòu)建語法樹
實現(xiàn)核心:構(gòu)建環(huán)境類,包含解釋器之外的一些全局信息,一般是 HashMap。
應(yīng)用實例:編譯器、運算表達式計算。
優(yōu)點:1、易擴展 2、表達式解釋方法增加 3、易于實現(xiàn)文法
缺點: 1、可利用場景數(shù)量不確定。 2、復(fù)雜文法難維護。 3、解釋器模式可能引起類膨脹。文章來源:http://www.zghlxwxcb.cn/news/detail-659250.html
使用場景:SQL 解析、符號處理引擎等。文章來源地址http://www.zghlxwxcb.cn/news/detail-659250.html
實現(xiàn)
步驟 1
創(chuàng)建一個表達式接口。
Expression.java
public interface Expression {
public boolean interpret(String context);
}
步驟 2
創(chuàng)建實現(xiàn)了上述接口的實體類。
TerminalExpression.java
public class TerminalExpression implements Expression {
private String data;
public TerminalExpression(String data){
this.data = data;
}
@Override
public boolean interpret(String context) {
if(context.contains(data)){
return true;
}
return false;
}
}
OrExpression.java
public class OrExpression implements Expression {
private Expression expr1 = null;
private Expression expr2 = null;
public OrExpression(Expression expr1, Expression expr2) {
this.expr1 = expr1;
this.expr2 = expr2;
}
@Override
public boolean interpret(String context) {
return expr1.interpret(context) || expr2.interpret(context);
}
}
AndExpression.java
public class AndExpression implements Expression {
private Expression expr1 = null;
private Expression expr2 = null;
public AndExpression(Expression expr1, Expression expr2) {
this.expr1 = expr1;
this.expr2 = expr2;
}
@Override
public boolean interpret(String context) {
return expr1.interpret(context) && expr2.interpret(context);
}
}
步驟 3
InterpreterPatternDemo 使用 Expression 類來創(chuàng)建規(guī)則,并解析它們。
InterpreterPatternDemo.java
public class InterpreterPatternDemo {
//規(guī)則:Robert 和 John 是男性
public static Expression getMaleExpression(){
Expression robert = new TerminalExpression("Robert");
Expression john = new TerminalExpression("John");
return new OrExpression(robert, john);
}
//規(guī)則:Julie 是一個已婚的女性
public static Expression getMarriedWomanExpression(){
Expression julie = new TerminalExpression("Julie");
Expression married = new TerminalExpression("Married");
return new AndExpression(julie, married);
}
public static void main(String[] args) {
Expression isMale = getMaleExpression();
Expression isMarriedWoman = getMarriedWomanExpression();
System.out.println("John is male? " + isMale.interpret("John"));
System.out.println("Julie is a married women? "
+ isMarriedWoman.interpret("Married Julie"));
}
}
步驟 4
執(zhí)行程序,輸出結(jié)果:
John is male? true
Julie is a married women? true
這段代碼是一個解釋器模式(Interpreter Pattern)的示例。解釋器模式用于定義語言的文法,并解析相關(guān)的表達式。
在這個示例中,首先創(chuàng)建了一個表達式接口 Expression,其中定義了一個 interpret 方法用于解釋表達式。
接著定義了三個實現(xiàn)了 Expression 接口的實體類:TerminalExpression、OrExpression、AndExpression。
TerminalExpression 類表示終結(jié)符表達式,它用于判斷給定的上下文是否包含特定的數(shù)據(jù)。
OrExpression 類和 AndExpression 類表示非終結(jié)符表達式,它們用于組合其他表達式并進行邏輯運算。
最后,在 InterpreterPatternDemo 類中使用 Expression 類來創(chuàng)建具體的規(guī)則,并對其進行解析。
在 main 方法中,通過調(diào)用 getMaleExpression 和 getMarriedWomanExpression 方法創(chuàng)建了兩條規(guī)則,并使用 interpret 方法對輸入的上下文進行解釋。
運行程序后,輸出了兩個解釋結(jié)果。
注意:這只是解釋器模式的一個簡單示例,實際應(yīng)用中可能會更加復(fù)雜。解釋器模式通常用于處理特定領(lǐng)域的語言解析或規(guī)則驗證等場景。
到了這里,關(guān)于設(shè)計模式詳解-解釋器模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!