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

2022-01-17 18:00:10 字數 2741 閱讀 8647

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

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

下面看下直譯器模式的結構圖

基本**:

/// /// 

上下文資訊

///

public class

context

}/// ///

抽象表示式,宣告乙個抽象的解釋操作

///

public abstract class

abstractexpression

public class

terminalexpression

:abstractexpression

}public class

nonterminalexpression

: abstractexpression

}public class

console

.writeline(context.data);}}

接下來看乙個實際的應用,功能是數字的轉換,如將「五百二十」轉換成「520「,首先建立乙個context類用來儲存上下文資訊,類中有兩個屬性statement和data,分別用來存放漢字的數字和阿拉伯數字。

public class 

context

public int

data

}

抽象的expression類

/// /// 

抽象表示式類

///

public abstract class

expression

public virtual void

interpret(

context

context)

foreach

(string

key

in table.keys)

if (context.statement.endswith(

"零"))}}

public abstract string

getpostfix();

public abstract int

multiplier();

public virtual int

getlength()

}

個十百千萬的表示式類

public class 

geexpression

: expression

public override int

multiplier()

public override int

getlength()

}public class

shiexpression

: expression

public override int

multiplier()

}public class

baiexpression

: expression

public override int

multiplier()

}public class

qianexpression

: expression

public override int

multiplier()

}public class

wanexpression

: expression

public override int

multiplier()

}

客戶端呼叫

class 

program

;

list

<

expression

> list =

new

list

<

expression

>();

list.add(

new

geexpression

());

list.add(

new

shiexpression

());

list.add(

new

baiexpression

());

list.add(

new

qianexpression

());

list.add(

new

wanexpression

());

foreach

(expression

exp

in list)

console

.writeline(

"=", num, context.data);}}

執行結果

返回開篇(索引)

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

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

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

四則運算問題 通過直譯器模式來實現四則運算,如計算a b c的值,具體要求 1 先輸入表示式的形式,比如 a b c d e,要求表示式的字母不能重複 2 在分別輸入a b,c,d,e 的值 傳統方案解決四則運算問題分析 1 編寫乙個方法,接收表示式的形式,然後根據使用者輸入的數值進行解析,得到結果...

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

給分析物件定義乙個語言,並定義該語言的文法表示,再設計乙個直譯器來解釋語言中的句子。該模式實現了文法表示式處理的介面,該介面解釋乙個特定的上下文。優點擴充套件性好。由於在直譯器模式中使用類來表示語言的文法規則,因此可以通過繼承等機制來改變或擴充套件文法 容易實現。在語法樹中的每個表示式節點類都是類似...