設計模式之直譯器模式

2021-08-29 07:32:54 字數 3753 閱讀 4585

interpreter模式也叫直譯器模式,是行為模式之一,它是一種特殊的設計模式,它建立乙個直譯器,對於特定的計算機程式語言,用來解釋預先定義的文法。簡單地說,interpreter模式是一種簡單的語法直譯器構架。

換一種解釋就是定義乙個語法, 定義乙個直譯器,該直譯器處理該語法句子將某些複雜問題,表達為某種語法規則,然後構建直譯器來解釋處理這類句子。

直譯器模式的結構:

優缺點

優點:缺點:

一般的適用場景

使用時的注意事項:

有乙個大資料的專案,大資料統計專案遇到了問題:

按照計算模型對現有資料統計、分析、**,一般的計算模型是乙個或多個運算公式,通常是加減乘除四則運算,設計方案要有高擴充套件性。

計算模型的設計:

計算模型按正常算術方式書寫,直譯器處理語法邏輯

計算模型裡有兩類符號:資料和計算符

用逆波蘭演算法分析算式語法

用直譯器模式處理資料。

這裡專案中其實就是要使用直譯器來計算符號公式。 解釋的意思就是用一種方式或語法來執行他。

專案設計的類圖如下所示:

具體的**如下:

abstractexpresstion:抽象表示式:

public

abstract

class

abstractexpresstion

varexpresstion:

public

class

varexpresstion

extends

abstractexpresstion

@override

public float interpreter

(hashmap

var)

}

具體的」加減乘除「運算子:

public

class

addexpresstion

extends

symbolexpresstion

@override

public float interpreter

(hashmap

var)

}

public

class

subexpresstion

extends

symbolexpresstion

@override

public float interpreter

(hashmap

var)

}

public

class

multiexpresstion

extends

symbolexpresstion

@override

public float interpreter

(hashmap

var)

}

public

class

divexpresstion

extends

symbolexpresstion

@override

public float interpreter

(hashmap

var)

}

逆波蘭實現,具體就是統一的實現運算的,讓計算表示式轉換成為逆波蘭表示式,然後可以實現按運算子運算順序規則的運算。

public

class

rpn}

// 將中序表示式轉換為右序表示式

private

void

toright()

else

}else

astack.

push

(expression.

get(position));

}}}else

right.

add(expression.

get(position));

position++;if

(position >= expression.

size()

)break;}

while

(astack.top !=-1

)}// 對右序表示式進行求值

public

void

getresult

(hashmap

var)

else

stack.

push

(new

varexpresstion

(is));

} result = stack.

pop();

it = expression.

iterator()

;while

(it.

hasnext()

) system.out.

println

("="

+ result.

interpreter

(var));

}public

static

class

calculate

// 設定操作符號的優先級別

public

static

intpriority

(string operator)

// 做2值之間的計算

public

static abstractexpresstion tworesult

(string op,

abstractexpresstion a, abstractexpresstion b)

catch

(numberformatexception e)}}

// 棧類

public

class

stacks

public object pop()

public object top()

}}

底部的計算器:

public

class

calculator

system.out.

println

(";");

}try

} system.out

.println

("input another expression or input 'q' to quit:");

} is.

close()

;}catch

(ioexception e)

}}

測試類:

public

class

maintest

}

看一下輸出吧,就是實現了表示式的運算:

設計模式之直譯器模式

直譯器模式是一種類行為型模式,它主要是用來解釋特定語言的特定文法表示,雖然這個在實際生產中不常用到,但是我們學習一下還是有幫助的。定義 給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。使用場景 當有乙個語言需要解釋執行,並且你可將該語言中的句子表示為乙...

設計模式之直譯器模式

直譯器模式 1.直譯器模式 給定乙個語言,定義它文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。如果一種特定型別的問題發生的頻率足夠高,那麼可能就值得將該問題的各個例項表述為乙個簡單語言中的句子。這樣就可以構建乙個直譯器,該直譯器通過解釋這些句子來解決該問題。比如 在字串中...

設計模式之直譯器模式

解析器模式是一種行為型設計模式。其思想是 給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,該直譯器使用該表示來解釋語言中的句子。解析器模式涉及4個角色 結構圖 於網路 下面提供乙個簡單例子。乙個簡易的控制台計算器,要求使用者輸入乙個表示式,如a b c,然後要求使用者輸入每個變數的具體值,如...