github地址:https://github.com/cheesezh/python_design_patternspython
解釋器模式,給定一個語言,定一個它的文法的一種表示,並定一個一個解釋器,這個解釋器使用該表示來解釋語言中的橘子。git
解釋其模式須要解決的是,若是一種特定類型的問題發生的頻率足夠高,那麼可能就值得將該問題的各個實例表述爲一個簡單語言中的橘子。這樣就能夠構建一個解釋器,該解釋器經過解釋這些橘子來解決該問題。github
好比說,咱們經常會在字符串中搜索匹配的字符或者判斷一個字符串是否符合咱們的規定格式,此時咱們通常會用正則表達式技術。由於匹配字符串的需求在不少地方都會用到,並且行爲相似,與其爲每個特定需求都寫一個算法函數,不如使用一種通用的搜索算法來解釋執行一個正則表達式,該正則表達式定義了待匹配字符串的集合。正則表達式
正則表達式就是解釋器模式的一種用用,解釋器爲正則表達式定義了一個文法,如何表示一個特定的正則表達式,以及如何解釋這個正則表達式。算法
解釋器模式主要包含如下幾個類:app
from abc import ABCMeta, abstractmethod class AbstractExpression(): """ 抽象表達式類,聲明一個抽象的解釋操做,這個接口爲抽象語法樹中全部的節點所共享 """ __metaclass__ = ABCMeta @abstractmethod def interpret(self, context): pass class TerminalExpression(AbstractExpression): """ 終結符表達式,實現與文法中的終結符相關聯的解釋操做。實現抽象表達式中所要求的接口,主要是一個interpret()方法。 文法中的每個終結符都有一個具體終結符表達式與之相對應。 """ def interpret(self, context): print("終結符表達式") class NontermialExpression(AbstractExpression): """ 非終結符表達式,爲文法中的非終結符實現解釋操做。對文法中每一條規則R1,R2,...Rn都須要一個具體的非終結符表達式類。 經過實現抽閒表達式的interpret()方法實現解釋操做。解釋操做以遞歸的方式調用上 main所提到的表明R1,R2,...Rn中各 個符號的實例變量。 """ def interpret(self, context): print("非終結符表達式") class Context(): """ 上下文類,包含解釋器以外的一些全局信息 """ def __init__(self): self.input = None self.output = None def main(): """ 客戶端代碼,構建表示該文法定義的語言中一個特定的句子的抽象語法樹。 """ context = Context() exp_list = [] exp_list.append(TerminalExpression()) exp_list.append(NontermialExpression()) exp_list.append(TerminalExpression()) exp_list.append(NontermialExpression()) for exp in exp_list: exp.interpret(context) main()
終結符表達式 非終結符表達式 終結符表達式 非終結符表達式
當有一個語言須要解釋執行,而且你可將該語言中的句子表示爲一個抽象語法樹時,可以使用解釋器模式[DP]。函數
用瞭解釋器模式,就意味着能夠很容易的改變和擴展文法,由於該模式使用類來表示文法規則,你可使用繼承來改變或擴展該文法。也比較容易實現文法,由於定義抽象語法樹中各個節點的類的實現大致相似,這些類都易於直接便攜。code
解釋器模式也有不足,解釋器模式爲文法中每一條規則至少定義了一個類,所以包含許多規則的文法可能難以管理和維護。建議當文法很是複雜時,使用其餘技術,如語法分析程序或者編譯器生成器來處理[DP]。繼承