今天給大家介紹的設計模式叫做「直譯器模式」,該模式是「行為型設計模式」中的一員。
直譯器模式的核心思想是:給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,使用該直譯器來解釋語言中的句子。
聽完這句話話是不是頓時感覺一臉懵?什麼語言、文法、句子,都是些什麼鬼?
別慌讓「菜鳥」來給你分析一波。
文法:可以將其理解為一種規則,就好比漢語中一句話必須由「主謂賓」三者構成一樣。我們可以通過直譯器將語言中的句子解析成一顆語法樹,從而對其進行操作。所謂的語法樹就是將句子通過文法進行推導,進而獲取到句子的一棵樹形表現形式。句子:符合文法規則的一種表現,可以簡單理解成符合漢語規則的一句話。
語言:將所有句子匯集起來的乙個集合就是語言。
類圖講解
context:環境角色(上下文),含有每個直譯器所需的一些資料或全域性的一些資訊。下面讓我們通過乙個經典的「計算器」案例來詳細了解一下直譯器模式。abstractexpression:抽象表示式類,宣告了抽象的解釋操作,所有直譯器類都繼承或實現該類。
terminalexpression:終結符表示式類,是abstractexpression的子類,實現了文法中有關終結符相關的解釋操作。
terminalexpression:非終結符表示式,abstractexpression的子類,該類的功能與終結表示式類相反,文法中所有非終結符由該類進行解釋。
client:客戶端測試類。
注:本文重點講解的是直譯器模式故示例**只實現了加減法的運算。表示式介面
變數解析器類public
inte***ce
expression
* @return 返回解釋後的值。
*/intinterpreter
(map
map)
;}
運算子解析器類public
class
varexpression
implements
expression
// 通過key獲取所對應的值
@override
public
intinterpreter
(map
map)
}
減法解析器public
class
symbolexpression
implements
expression
// 不同種類的運算子由不同的運算子子類進行解析,所以該類不實現interpreter方法。
@override
public
intinterpreter
(map
map)
}
加法解析器public
class
subexpression
extends
symbolexpression
// 解釋減法
@override
public
intinterpreter
(map
map)
}
計算器 => 對應context角色public
class
addexpression
extends
symbolexpression
// 解釋加法
@override
public
intinterpreter
(map
map)
}
客戶端測試類public
class
calculator
}// 遍歷完成獲取最終解析好的表示式。
this
.expression = stack.
pop();
}/**
** @param map 表示式對應的值
* @return 計算的結果
*/public
intcalculate
(map
map)
}
執行結果public
class
client
}
1、使用直譯器模式可以提高**的可擴充套件性。
2、使用直譯器模式會引起類膨脹。
3、直譯器模式會採用遞迴呼叫方法,可能會降低效率,並且會提高維護和除錯的成本。
4、直譯器模式的使用場景比較少,開發中也不經常接觸到,一般常用在編譯器、運算表示式計算、正規表示式解析等。
今天的分享就到這裡了,如果感覺「菜鳥」寫的文章還不錯,記得點讚加關注呦!你們的支援就是我堅持下去的動力。文章**寫的有問題的也希望大家可以指出,我會虛心受教。
設計模式之直譯器模式
直譯器模式是一種類行為型模式,它主要是用來解釋特定語言的特定文法表示,雖然這個在實際生產中不常用到,但是我們學習一下還是有幫助的。定義 給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。使用場景 當有乙個語言需要解釋執行,並且你可將該語言中的句子表示為乙...
設計模式之直譯器模式
直譯器模式 1.直譯器模式 給定乙個語言,定義它文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。如果一種特定型別的問題發生的頻率足夠高,那麼可能就值得將該問題的各個例項表述為乙個簡單語言中的句子。這樣就可以構建乙個直譯器,該直譯器通過解釋這些句子來解決該問題。比如 在字串中...
設計模式之直譯器模式
解析器模式是一種行為型設計模式。其思想是 給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,該直譯器使用該表示來解釋語言中的句子。解析器模式涉及4個角色 結構圖 於網路 下面提供乙個簡單例子。乙個簡易的控制台計算器,要求使用者輸入乙個表示式,如a b c,然後要求使用者輸入每個變數的具體值,如...