行為型設計模式 直譯器模式詳解

2022-03-11 13:12:59 字數 2072 閱讀 1202

直譯器模式(interpreter pattern)提供了評估語言的語法或表示式的方式,它屬於行為型模式。這種模式實現了乙個表示式介面,該介面解釋乙個特定的上下文。

給定乙個語言,定義它的文法表示,並定義乙個直譯器,這個直譯器使用該標識來解釋語言中的句子。

該模式對於複雜的場景實現起來比較困難,實際應用較少,大家了解即可。

context(環境角色):宣告乙個所有具體表示式都要實現的抽象介面(或者抽象類),介面中主要是乙個interpret() 方法,稱為解釋操作。具體解釋任務由它的各個實現類來完成,具體的直譯器分別由終結符直譯器 terminalexpression 和非終結符直譯器 nonterminalexpression 完成。

abstractexpression(抽象直譯器):實現與文法中的元素相關聯的解釋操作,通常乙個直譯器模式中只有乙個終結符表示式,但有多個例項,對應不同的終結符。終結符一半是文法中的運算單元,比如有乙個簡單的公式r=r1+r2,在裡面 r1 和 r2 就是終結符,對應的解析 r1 和 r2 的直譯器就是終結符表示式。

terminalexpression(終結符表示式):文法中的每條規則對應於乙個非終結符表示式,非終結符表示式一般是文法中的運算子或者其他關鍵字,比如公式 r=r1+r2 中,+ 就是非終結符,解析 + 的直譯器就是乙個非終結符表示式。非終結符表示式根據邏輯的複雜程度而增加,原則上每個文法規則都對應乙個非終結符表示式。

noterminalexpression(非終結符表示式):這個角色的任務一般是用來存放文法中各個終結符所對應的具體值,比如 r=r1+r2,我們給 r1 賦值 100,給 r2 賦值 200。這些資訊需要存放到環境角色中,很多情況下我們使用 map 來充當環境角色就足夠了。

使用直譯器模式實現數字的加減法

1、抽象直譯器

/**

* 抽象直譯器

*/public abstract class abstractexpression

2、非終結符表示式

/**

* 非終結表示式:加法

*/public class addexpression extends abstractexpression

@override

public int interpret(context context)

}/**

* 非終結表示式:減法

*/public class subexpression extends abstractexpression

@override

public int interpret(context context)

}

3、終結表示式

/**

* 終結表示式:變數

*/public class variable extends abstractexpression

@override

public int interpret(context context)

}

4、環境角色

/**

* 環境上下文

*/public class context

public int getvalue(final string key)

public mapgetvaluemap()

}

5、測試類

public class client 

}

6、執行結果

a+b-c=14

優點:缺點:適用場景:

Java設計模式 行為型 直譯器模式

x是乙個變數,y也是乙個變數,x可以為任何值,y也可以為任何值。因此,每個變數都可以對應乙個具體的值,通過上下文可以承載這樣的對映關係。public class context 獲取變數值 public integer lookup variable variable 無論是變數還是表示式,都能獲得...

直譯器模式(行為型)

定義 給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,該直譯器使用該表示來解釋語言中的句子。結構 適用場景 uml類圖 下面就是直譯器模式的 實現 expression public inte ce expression nonterminalexpression public class ...

設計模式筆記 16 直譯器模式(行為型)

給定乙個語言,定義它的文法的一種表示,並定義一種直譯器,這個直譯器使用該表示來解釋語言中的句 子。在軟體構建過程中,如果某一特定領域的問題比較複雜,類似的模式不斷重複出現,如果使用普通的程式設計方式來實現將面臨非常頻繁的變化。在這種情況下,將特定領域的問題表達為某種語法規則下的句子,然後構建乙個直譯...