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