行為型設計模式之Interpreter(解釋器)
前言:
自己的話理解:自定義一個解釋器用來校驗參數或數據是否合法。
1)意圖
給定一個語言,定義它的文法的一種表示,并定義一個解釋器,這個解釋器使用該表示來解釋語音中的句子。
2)結構
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;/*** @author psd 行為設計模式之解釋器模式*/
public class InterpreterPattern {public static void main(String[] args) {Context context = new Context();context.check("江蘇的南京");context.check("南京的一哥");context.check("南京的蕪湖");context.check("安徽的合肥");System.out.println("------------");context.check("合肥的馬鞍山");}
}/*** 表達式接口*/
interface Expression {/*** 解釋器 判斷是否合法* * @param context* 文本信息* @return 是否合法*/boolean interpret(String context);
}class Context{private String[] prefixArr = {"江蘇","安徽","南京"};private String[] suffixArr = {"南京","蘇州","合肥","馬鞍山","蕪湖", "|州","一哥","馬鞍山"};private NonterminalExpression nonterminalExpression;public Context() {TerminalExpression presix = new TerminalExpression(prefixArr);TerminalExpression suffix = new TerminalExpression(suffixArr);nonterminalExpression = new NonterminalExpression(presix, suffix);}public void check(String info) {boolean result = nonterminalExpression.interpret(info);if (result) {System.out.println("識別成功.....");} else {System.out.println("識別失敗.....");}}
}/*** 非終端表達式*/
class NonterminalExpression implements Expression {private TerminalExpression presix;private TerminalExpression suffix;public NonterminalExpression(TerminalExpression presix, TerminalExpression suffix) {this.presix = presix;this.suffix = suffix;}@Overridepublic boolean interpret(String context) {String[] splitStr = context.split("的");// 判斷前綴和后綴是否合法return presix.interpret(splitStr[0]) && suffix.interpret(splitStr[1]);}
}/*** 終端表達式*/
class TerminalExpression implements Expression {private Set<String> set = new HashSet<>();public TerminalExpression(String[] data) {Collections.addAll(set, data);}/*** 判斷是否合法* * @param context* 文本信息* @return 是否合法*/@Overridepublic boolean interpret(String context) {return set.contains(context);}
}
3)適用性
Interpreter模式適用于當有一個語言需要解釋執行,并且可將該語言中的句子表示為一個抽
象語法樹時,以下情況效果最好:
- 該文法簡單。對于復雜的發文,文法的類層次變得龐大而無法管理。
- 效率不是一個關鍵問題。最高效的解釋器通常不是通過直接解釋語法分析樹實現的,
而是首先將它們轉換成另一種形式。
總結:何時選擇解釋器模式
場景特征 例子
需解析領域特定語言(DSL) 金融公式、業務規則表達式
頻繁處理結構化查詢/過濾條件 自定義日志過濾器、數據查詢
簡單語法且變化不頻繁 數學表達式、布爾邏輯解析
動態執行用戶定義的規則 游戲AI條件、促銷活動規則引擎
喜歡我的文章記得點個在看,或者點贊,持續更新中ing…