作者持續關注 WPS二次開發專題系列,持續為大家帶來更多有價值的WPS開發技術細節,如果能夠幫助到您,請幫忙來個一鍵三連,更多問題請聯系我(QQ:250325397)
定義
解釋器模式(Interpreter Pattern)提供了評估語言的語法或表達式的方式,它屬于行為型模式。這種模式實現了一個表達式接口,該接口解釋一個特定的上下文。這種模式被用在 SQL 解析、符號處理引擎等。
特點
給定一個語言,定義它的文法表示,并定義一個解釋器,這個解釋器使用該標識來解釋語言中的句子。
使用場景
編譯器、運算表達式計算。
優缺點
(1) 優點
-
- 可擴展性比較好,靈活。
- 增加了新的解釋表達式的方式。
- 易于實現簡單文法。
(2) 缺點
-
- 可利用場景比較少。
- 對于復雜的文法比較難維護。
- 解釋器模式會引起類膨脹。
- 解釋器模式采用遞歸調用方法。
模式結構
-
- 定義一個抽象表達式(Expression)接口,它包含了解釋方法 interpret(String info)。
- 定義一個終結符表達式(Terminal Expression)類,它用集合(Set)類來保存滿足條件的城市或人,并實現抽象表達式接口中的解釋方法 interpret(Stringinfo),用來判斷被分析的字符串是否是集合中的終結符。
- 定義一個非終結符表達式(AndExpressicm)類,它也是抽象表達式的子類,它包含滿足條件的城市的終結符表達式對象和滿足條件的人員的終結符表達式對象,并實現 interpret(String info) 方法,用來判斷被分析的字符串是否是滿足條件的城市中的滿足條件的人員。
- 最后,定義一個環境(Context)類,它包含解釋器需要的數據,完成對終結符表達式的初始化,并定義一個方法 freeRide(String info) 調用表達式對象的解釋方法來對被分析的字符串進行解釋。
具體實現
接口和實現
/*** 抽象表達式類*/
interface Expression {/*** 解釋*/boolean interpret(String info);
}/*** 非終結符表達式類*/
class AndExpression implements Expression {private Expression city = null;private Expression person = null;public AndExpression(Expression city, Expression person) {this.city = city;this.person = person;}public boolean interpret(String info) {String s[] = info.split("的");return city.interpret(s[0]) && person.interpret(s[1]);}
}/*** 終結符表達式類*/
class TerminalExpression implements Expression {private Set<String> set = new HashSet<>();public TerminalExpression(String[] data) {set.addAll(Arrays.asList(data));}public boolean interpret(String info) {if (set.contains(info)) {return true;}return false;}
}
環境類
/*** 環境類*/
class Context {private String[] cities = {"武漢"};private String[] persons = {"老人", "婦女", "兒童"};private Expression cityPerson;public Context() {Expression city = new TerminalExpression(cities);Expression person = new TerminalExpression(persons);cityPerson = new AndExpression(city, person);}public void freeRide(String info) {boolean ok = cityPerson.interpret(info);if (ok) System.out.println("您是" + info + ",您本次乘車免費!");else System.out.println(info + ",您不是免費人員,本次乘車扣費2元!");}
}
具體使用
/*** 狀態模式* 介紹鏈接:https://www.kdocs.cn/l/ct3ki9na5JMo<pre>文法規則<expression> ::= <city>的<person><city> ::= 武漢<person> ::= 老人|婦女|兒童</pre>
*/
public class App {public static void main(String[] args) {Context bus = new Context();bus.freeRide("武漢的老人");bus.freeRide("武漢的年輕人");bus.freeRide("深圳的婦女");bus.freeRide("深圳的兒童");}
}
實際應用
- 存款利息計算(設置好計算規則)