![【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android中怎么實(shí)現(xiàn)解釋器模式_第1頁](http://file4.renrendoc.com/view/b280aa498f13a09b663e2e1797492d6b/b280aa498f13a09b663e2e1797492d6b1.gif)
![【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android中怎么實(shí)現(xiàn)解釋器模式_第2頁](http://file4.renrendoc.com/view/b280aa498f13a09b663e2e1797492d6b/b280aa498f13a09b663e2e1797492d6b2.gif)
![【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android中怎么實(shí)現(xiàn)解釋器模式_第3頁](http://file4.renrendoc.com/view/b280aa498f13a09b663e2e1797492d6b/b280aa498f13a09b663e2e1797492d6b3.gif)
![【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android中怎么實(shí)現(xiàn)解釋器模式_第4頁](http://file4.renrendoc.com/view/b280aa498f13a09b663e2e1797492d6b/b280aa498f13a09b663e2e1797492d6b4.gif)
![【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android中怎么實(shí)現(xiàn)解釋器模式_第5頁](http://file4.renrendoc.com/view/b280aa498f13a09b663e2e1797492d6b/b280aa498f13a09b663e2e1797492d6b5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android中怎么實(shí)現(xiàn)解釋器模式
本篇文章為大家展示了Android中怎么實(shí)現(xiàn)解釋器模式,內(nèi)容簡明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。一、介紹解釋器模式(InterpreterPattern)是一種用的比較少的行為型模式,其提供了一種解釋語言的語法或表達(dá)式的方式,該模式定義了一個(gè)表達(dá)式接口,通過該接口解釋一個(gè)特定的上下文。在這么多的設(shè)計(jì)模式中,解釋器模式在實(shí)際運(yùn)用上相對(duì)來說要少很多,因?yàn)槲覀兒苌贂?huì)自己去構(gòu)造一個(gè)語言的文法。雖然如此,既然它能夠在設(shè)計(jì)模式中有一席之位,那么必定有它的可用之處。二、定義給定一個(gè)語言,定義它的文法的一種表示,并定義一個(gè)解釋器,該解釋器使用該表示來解釋語言中的句子。(其中語言就是我們需要解釋的對(duì)象,文法就是這個(gè)語言的規(guī)律,解釋器就是翻譯機(jī),通過文法來翻譯語言。)三、使用場景如果某個(gè)簡單的語言需要解釋執(zhí)行而且可以將該語言中的語句表示為一個(gè)抽象的語法樹時(shí)可以考慮使用解釋器模式。在某些特定的領(lǐng)域出現(xiàn)不斷重復(fù)的問題時(shí),可以將該領(lǐng)域的問題轉(zhuǎn)化為一種語法規(guī)則下的語句,然后構(gòu)建解釋器來解釋該語句。四、解釋器模式的UML類圖UML類圖:角色介紹:AbstractExpression:抽象表達(dá)式,聲明一個(gè)抽象的解釋操作父類,并定義一個(gè)抽象的interpret()解釋方法,其具體的實(shí)現(xiàn)在各個(gè)具體的子類解釋器中完成。TerminalExpression:終結(jié)符表達(dá)式,實(shí)現(xiàn)了抽象表達(dá)式角色所要求的接口,主要是一個(gè)interpret()方法;文法中的每一個(gè)終結(jié)符都有一個(gè)具體終結(jié)表達(dá)式與之相對(duì)應(yīng)。比如有一個(gè)簡單的公式R=R1+R2,在里面R1和R2就是終結(jié)符,對(duì)應(yīng)的解析R1和R2的解釋器就是終結(jié)符表達(dá)式。NonterminalExpression:非終結(jié)符表達(dá)式,文法中的每一條規(guī)則都需要一個(gè)具體的非終結(jié)符表達(dá)式,非終結(jié)符表達(dá)式一般是文法中的運(yùn)算符或者其他關(guān)鍵字,比如公式R=R1+R2中,“+”就是非終結(jié)符,解析“+”的解釋器就是一個(gè)非終結(jié)符表達(dá)式。Context:上下文環(huán)境類,這個(gè)角色的任務(wù)一般是用來存放文法中各個(gè)終結(jié)符所對(duì)應(yīng)的具體值,比如R=R1+R2,我們給R1賦值100,給R2賦值200。這些信息需要存放到環(huán)境角色中,很多情況下我們使用Map來充當(dāng)環(huán)境角色就足夠了。Client:客戶類,解析表達(dá)式,構(gòu)建抽象語法樹,執(zhí)行具體的解釋操作等。通用代碼如下:/**
*
抽象表達(dá)式
*/
public
abstract
class
AbstractExpression
{
/**
*
抽象的解析方法
*
@param
context
上下文環(huán)境對(duì)象
*/
public
abstract
void
interpret(Context
context);
}
/**
*
終結(jié)符表達(dá)式
*/
public
class
TerminalExpression
extends
AbstractExpression{
@Override
public
void
interpret(Context
context)
{
//實(shí)現(xiàn)文法中與終結(jié)符有關(guān)的解釋操作
}
}
/**
*
非終結(jié)符表達(dá)式
*/
public
class
NonterminalExpression
extends
AbstractExpression{
@Override
public
void
interpret(Context
context)
{
//實(shí)現(xiàn)文法中與非終結(jié)符有關(guān)的解釋操作
}
}
/**
*
上下文環(huán)境類
*/
public
class
Context
{
}
/**
*
客戶類
*/
public
class
Client
{
public
static
void
main(String[]
args)
{
//根據(jù)文法對(duì)特定句子構(gòu)建抽象語法樹后解釋
}
}五、簡單實(shí)現(xiàn)我們使用解釋器模式對(duì)“m+n+p”這個(gè)表達(dá)式進(jìn)行解釋,那么代表數(shù)字的m、n和p就可以看成終結(jié)符號(hào),而“+”這個(gè)運(yùn)算符號(hào)可以當(dāng)做非終結(jié)符號(hào)。抽象的算數(shù)運(yùn)算解釋器:public
abstract
class
ArithemticExpression
{
/**
*
抽象的解析方法
*
具體的解析邏輯由具體的子類實(shí)現(xiàn)
*
*
@return
解析得到具體的值
*/
public
abstract
int
interpreter();
}數(shù)字解釋器:public
class
NumExpression
extends
ArithemticExpression{
private
int
num;
public
NumExpression(int
num){
this.num
=
num;
}
@Override
public
int
interpreter()
{
return
num;
}
}運(yùn)算符號(hào)解釋器:public
abstract
class
OperatorExpression
extends
ArithemticExpression{
protected
ArithemticExpression
exp1,
exp2;
public
OperatorExpression(ArithemticExpression
exp1,
ArithemticExpression
exp2){
this.exp1
=
exp1;
this.exp2
=
exp2;
}
}具體的加法運(yùn)算符解釋器:public
class
AdditionExpression
extends
OperatorExpression{
public
AdditionExpression(ArithemticExpression
exp1,
ArithemticExpression
exp2)
{
super(exp1,
exp2);
}
@Override
public
int
interpreter()
{
return
erpreter()
+
erpreter();
}
}處理解釋器:public
class
Calculator
{
//聲明一個(gè)Stack棧儲(chǔ)存并操作所有相關(guān)的解釋器
private
Stack<ArithemticExpression>
mExpStack
=
new
Stack<ArithemticExpression>();
public
Calculator(String
expression){
//聲明兩個(gè)ArithemticExpression類型的臨時(shí)變量,儲(chǔ)存運(yùn)算符左右兩邊的數(shù)字解釋器
ArithemticExpression
exp1,exp2;
//根據(jù)空格分割表達(dá)式字符串(比如1
+
2
+
3
+
4)
String[]
elements
=
expression.split("
");
/*
*
遍歷表達(dá)式元素?cái)?shù)組
*/
for(int
i
=
0;
i
<
elements.length;
i++){
/*
*
判斷運(yùn)算符號(hào)
*/
switch
(elements[i].charAt(0))
{
case
'+':
//如果是加號(hào),則將棧中的解釋器彈出作為運(yùn)算符號(hào)左邊的解釋器
exp1
=
mExpStack.pop();
//同時(shí)將運(yùn)算符號(hào)數(shù)組下標(biāo)的下一個(gè)元素構(gòu)造為一個(gè)數(shù)字解釋器
exp2
=
new
NumExpression(Integer.parseInt(elements[++i]));
//通過上面的兩個(gè)數(shù)字解釋器構(gòu)造加法運(yùn)算解釋器
mExpStack.push(new
AdditionExpression(exp1,
exp2));
break;
default:
/*
*
如果為數(shù)字,直接構(gòu)造數(shù)字解釋器并壓入棧
*/
mExpStack.push(new
NumExpression(Integer.valueOf(elements[i])));
break;
}
}
}
/**
*
計(jì)算結(jié)果
*
*
@return
最終的計(jì)算結(jié)果
*/
public
int
calculate(){
return
mExpStack.pop().interpreter();
}
}調(diào)用:public
class
Client
{
public
static
void
main(String[]
args)
{
Calculator
c
=
new
Calculator("22
+
553
+
83
+
5");
System.out.println("計(jì)算結(jié)果:"+c.calculate());
}
}結(jié)果:計(jì)算結(jié)果:663如果相加如減法的操作,在Calculator中加入相應(yīng)判斷即可:public
class
SubtractionExpression
extends
OperatorExpression{
public
SubtractionExpression(ArithemticExpression
exp1,
ArithemticExpression
exp2)
{
super(exp1,
exp2);
}
@Override
public
int
interpreter()
{
return
erpreter()
-
erpreter();
}
}Calculator中加入:case
'-':
exp1
=
mExpStack.pop();
exp2
=
new
NumExpression(Integer.parseInt(elements[++i]));
mExpStack.push(new
SubtractionExpression(exp1,
exp2));
break;從上面可以看出解釋器模式很靈活,他將復(fù)雜問題可以簡單化、模塊化、分離實(shí)現(xiàn)、解釋執(zhí)行。六、Android源碼中解釋器模式1、PackageParserPackageParser是對(duì)AndroidManifest
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 華師大版數(shù)學(xué)八年級(jí)上冊(cè)12.5《因式分解》(第1課時(shí))聽評(píng)課記錄
- 現(xiàn)場服務(wù)協(xié)議書(2篇)
- 生活小家電代理銷售合同(2篇)
- 粵人版地理七年級(jí)上冊(cè)《第三節(jié) 聚落的發(fā)展變化》聽課評(píng)課記錄7
- 蘇州市公開課蘇教版六年級(jí)數(shù)學(xué)下冊(cè)《確定位置》聽評(píng)課記錄+教學(xué)反思
- 人教版數(shù)學(xué)八年級(jí)上下冊(cè)聽評(píng)課記錄(全冊(cè))
- 人教版部編歷史八年級(jí)上冊(cè)《第19課 七七事變與全民族抗戰(zhàn)》聽課評(píng)課記錄3
- 五年級(jí)上冊(cè)數(shù)學(xué)聽評(píng)課記錄《4.3 探索活動(dòng):平行四邊形的面積》(18)-北師大版
- 新版華東師大版八年級(jí)數(shù)學(xué)下冊(cè)《16分式復(fù)習(xí)》聽評(píng)課記錄15
- 人教版數(shù)學(xué)七年級(jí)下冊(cè)第16課時(shí)《6.1平方根(第1課時(shí))》聽評(píng)課記錄
- 2024時(shí)事政治考試題庫(基礎(chǔ)題)
- 2024山西文旅投資集團(tuán)招聘117人公開引進(jìn)高層次人才和急需緊缺人才筆試參考題庫(共500題)答案詳解版
- 小學(xué)校本課程教材《趣味數(shù)學(xué)》
- 干細(xì)胞療法推廣方案
- (2024年)電工安全培訓(xùn)(新編)課件
- mil-std-1916抽樣標(biāo)準(zhǔn)(中文版)
- 《社區(qū)康復(fù)》課件-第七章 腦癱患兒的社區(qū)康復(fù)實(shí)踐
- 城鄉(xiāng)環(huán)衛(wèi)一體化內(nèi)部管理制度
- 廣匯煤炭清潔煉化有限責(zé)任公司1000萬噸年煤炭分級(jí)提質(zhì)綜合利用項(xiàng)目變更環(huán)境影響報(bào)告書
- 小學(xué)數(shù)學(xué)六年級(jí)解方程練習(xí)300題及答案
- 大數(shù)據(jù)在化工行業(yè)中的應(yīng)用與創(chuàng)新
評(píng)論
0/150
提交評(píng)論