四則運算問題
通過直譯器模式來實現四則運算,如計算a+b-c的值,具體要求
1) 先輸入表示式的形式,比如 a+b+c-d+e, 要求表示式的字母不能重複
2) 在分別輸入a ,b, c, d, e 的值
傳統方案解決四則運算問題分析
1) 編寫乙個方法,接收表示式的形式,然後根據使用者輸入的數值進行解析,得到結果
2) 問題分析:如果加入新的運算子,比如 * / ( 等等,不利於擴充套件,另外讓乙個方法來解析會造成程式結構混亂,不夠清晰.
3) 解決方案:可以考慮使用直譯器模式, 即: 表示式 -> 直譯器(可以有多種) -> 結果
直譯器模式基本介紹
1) 在編譯原理中,乙個算術表示式通過 詞法分析器 形成詞法單元,而後這些詞法單元再通過 語法分析器 構建語法分析樹,最終形成一顆抽象的語法分析樹。這裡的詞法分析器和語法分析器都可以看做是直譯器
2) 直譯器模式(interpreter pattern):是指給定乙個語言(表示式),定義它的文法的一種表示,並定義乙個直譯器,使用該直譯器來解釋語言中的句子(表示式)
3) 應用場景
• 應用可以將乙個需要解釋執行的語言中的句子表示為乙個抽象語法樹
• 一些重複出現的問題可以用一種簡單的語言來表達
• 乙個簡單語法需要解釋的場景
4) 這樣的例子還有,比如編譯器、運算表示式計算、正規表示式、機械人等
/**
* 抽象類表示式,通過hashmap 鍵值對, 可以獲取到變數的值
* * @author administrator
* */
public abstract class expression
public abstract int interpreter(hashmapvar);
}/**
* 加法直譯器
* @author administrator
* */
public class addexpression extends symbolexpression
//處理相加
//var 仍然是 ..
//一會我們debug 原始碼,就ok
public int interpreter(hashmapvar)
}public class calculator
} //當遍歷完整個 chararray 陣列後,stack 就得到最後expression
this.expression = stack.pop();
} public int run(hashmapvar)
//然後傳遞給expression的interpreter進行解釋執行
return this.expression.interpreter(var); }}
public class subexpression extends symbolexpression
//求出left 和 right 表示式相減後的結果
public int interpreter(hashmapvar)
}/**
* 抽象運算符號解析器 這裡,每個運算符號,都只和自己左右兩個數字有關係,
* 但左右兩個數字有可能也是乙個解析的結果,無論何種型別,都是expression類的實現類
* * @author administrator
* */
public class symbolexpression extends expression
//因為 symbolexpression 是讓其子類來實現,因此 interpreter 是乙個預設實現
@override
public int interpreter(hashmapvar)
}/**
* 變數的直譯器
* @author administrator
* */
public class varexpression extends expression
// var 就是
// interpreter 根據 變數名稱,返回對應值
@override
public int interpreter(hashmapvar)
}public class clienttest
calculator calculator = new calculator(expstr);
system.out.println("運算結果:" + expstr + "=" + calculator.run(var));
} // 獲得表示式
public static string getexpstr() throws ioexception
// 獲得值對映
public static hashmapgetvalue(string expstr) throws ioexception
}} return map;
}}
直譯器模式的注意事項和細
1) 當有乙個語言需要解釋執行,可將該語言中的句子表示為乙個抽象語法樹,就可以考慮使用直譯器模式,讓程式具有良好的擴充套件性
2) 應用場景:編譯器、運算表示式計算、正規表示式、機械人等
3) 使用直譯器可能帶來的問題:直譯器模式會引起類膨脹、直譯器模式採用遞迴呼叫方法,將會導致除錯非常複雜、效率可能降低.
設計模式 行為型模式 直譯器模式
給分析物件定義乙個語言,並定義該語言的文法表示,再設計乙個直譯器來解釋語言中的句子。該模式實現了文法表示式處理的介面,該介面解釋乙個特定的上下文。優點擴充套件性好。由於在直譯器模式中使用類來表示語言的文法規則,因此可以通過繼承等機制來改變或擴充套件文法 容易實現。在語法樹中的每個表示式節點類都是類似...
行為型模式 直譯器模式
定義乙個語言的文法,並且建立乙個直譯器來解釋該語言中的句子,這裡的 語言 是指使用規定格式和語法的 直譯器模式是一種類行為型模式。abstract class abstractexpression class terminalexpression extends abstractexpression...
Java設計模式 行為型模式之直譯器模式
一 前言 直譯器模式,就像我們生活場景中的翻譯一樣,它給定某種語言,並定義它的文法表示,直譯器通過這種標識來對語句進行翻譯。直譯器模式一般很少用於我們的 開發中,不到萬不得已我們是不會考慮 直譯器這種設計模式的。因為這種設計模式應用場景很少,而且需要的類也很多,很容易引起類膨脹,複雜的語法也使得其難...