設計模式之 直譯器模式

2021-10-12 13:51:52 字數 3074 閱讀 9043

今天給大家介紹的設計模式叫做「直譯器模式」,該模式是「行為型設計模式」中的一員。

直譯器模式的核心思想是:給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,使用該直譯器來解釋語言中的句子。

聽完這句話話是不是頓時感覺一臉懵?什麼語言、文法、句子,都是些什麼鬼?

別慌讓「菜鳥」來給你分析一波。

文法:可以將其理解為一種規則,就好比漢語中一句話必須由「主謂賓」三者構成一樣。

句子:符合文法規則的一種表現,可以簡單理解成符合漢語規則的一句話。

語言:將所有句子匯集起來的乙個集合就是語言。

我們可以通過直譯器將語言中的句子解析成一顆語法樹,從而對其進行操作。所謂的語法樹就是將句子通過文法進行推導,進而獲取到句子的一棵樹形表現形式。

類圖講解

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)

}

加法解析器

public

class

addexpression

extends

symbolexpression

// 解釋加法

@override

public

intinterpreter

(map

map)

}

計算器 => 對應context角色

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,然後要求使用者輸入每個變數的具體值,如...