【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android中怎么實(shí)現(xiàn)解釋器模式_第1頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android中怎么實(shí)現(xiàn)解釋器模式_第2頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android中怎么實(shí)現(xiàn)解釋器模式_第3頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android中怎么實(shí)現(xiàn)解釋器模式_第4頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android中怎么實(shí)現(xiàn)解釋器模式_第5頁
已閱讀5頁,還剩3頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android中怎么實(shí)現(xiàn)解釋器模式

本篇文章為大家展示了Android中怎么實(shí)現(xiàn)解釋器模式,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。一、介紹解釋器模式(InterpreterPattern)是一種用的比較少的行為型模式,其提供了一種解釋語言的語法或表達(dá)式的方式,該模式定義了一個(gè)表達(dá)式接口,通過該接口解釋一個(gè)特定的上下文。在這么多的設(shè)計(jì)模式中,解釋器模式在實(shí)際運(yùn)用上相對來說要少很多,因?yàn)槲覀兒苌贂?huì)自己去構(gòu)造一個(gè)語言的文法。雖然如此,既然它能夠在設(shè)計(jì)模式中有一席之位,那么必定有它的可用之處。二、定義給定一個(gè)語言,定義它的文法的一種表示,并定義一個(gè)解釋器,該解釋器使用該表示來解釋語言中的句子。(其中語言就是我們需要解釋的對象,文法就是這個(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á)式與之相對應(yīng)。比如有一個(gè)簡單的公式R=R1+R2,在里面R1和R2就是終結(jié)符,對應(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é)符所對應(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)境對象

*/

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ù)文法對特定句子構(gòu)建抽象語法樹后解釋

}

}五、簡單實(shí)現(xiàn)我們使用解釋器模式對“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是對AndroidManifest

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論