優勢:正則表達式
① 若是一個特定問題發生頻率夠高,就值得將其實例表述(解釋爲)爲一個簡單語言的句子,如用正則表達式匹配手機號,油箱等express
② 必須已有一種語言,以後,先定義其文法表示,而後定義其解釋器,用解釋器來解釋此語言中的句子spa
缺點:code
① 此模式爲文法中的每一條規則至少定義了一個類,所以包含了許多規則的文法可能難以管理和維護。blog
適用範圍:接口
特定類型的問題發生的頻率足夠高,就能夠考慮將其表述爲一個簡單語言句子get
客戶端:string
Content text = new Content();it
//音樂-上海灘
System.out.println("上海灘:");io
//待解釋的音符串
text.setText("T 500 O 2 E 0.5 G 0.5 A 3 E 0.5 G 0.5 D 3 E 0.5 G 0.5 A 0.5 O 3 C 1 O 2 A 0.5 G 1 C 0.5 E 0.5 D 3 ");
//抽象解釋器接口
AbstractExpression expression = null;
try {
while(text.getText().length()>0){
String str = text.getText().substring(0,1);
switch (str){
//演奏速度
case "T":
expression = new TerminalExpression3();
break;
//音階
case "O":
expression = new TerminalExpression2();
break;
//音符
case "A":
case "B":
case "C":
case "D":
case "E":
case "F":
case "G":
expression = new TerminalExpression1();
break;
}
// 解釋,每次截取一個字母+數值(即標識+值),不斷循環截取解釋
expression.interpret(text);
}
} catch (Exception e) {
e.printStackTrace();
}
//打印結果:
上海灘:
中速 中音 5 7 1 5 7 4 5 7 1 高音 3 中音 1 7 3 5 4
/** * AbstractExpression 抽象表達式類 (抽象解釋類) -- 獲取標識和值,及解釋的方法,由實例化對其進行具體解釋 * TerminalExpression1 TerminalExpression2 TerminalExpression3 (音符、音階、演奏速度) NoTerminalExpression(其餘) -- 都是AbstractExpression的實例化 * Content 演奏內容 -- 標識和值的集合 */