Java設(shè)計(jì)模式之解釋器模式
解釋器模式字面意思,也即解釋某些內(nèi)容的含義。這種設(shè)計(jì)模式是實(shí)際開(kāi)發(fā)中最不容易用到的。比如SQL解析,符號(hào)處理引擎,會(huì)用到解釋器模式,屬于更底層的開(kāi)發(fā)人員才會(huì)用到的設(shè)計(jì)模式。
本文就以解釋器模式的概念、角色和簡(jiǎn)單的例子說(shuō)明解釋器模式,讀者對(duì)這部分內(nèi)容了解即可。
一、概念
解釋器模式是指給定一門(mén)語(yǔ)言,定義它的文法的一種表示(如:加減乘除表達(dá)式和正則表達(dá)式等),然后再定義一個(gè)解釋器,該解釋器用來(lái)解釋我們的文法表示(表達(dá)式)。
解釋器模式的結(jié)構(gòu)與組合模式相似,不過(guò)其包含的組成元素比組合模式多,而且組合模式是對(duì)象結(jié)構(gòu)型模式,而解釋器模式是類(lèi)行為型模式。
解釋器模式中包含四個(gè)角色:
抽象解釋器(Abstract Expression)角色:定義解釋器的接口,約定解釋器的解釋操作,主要包含解釋方法 interpret()。
終結(jié)符解釋器(Terminal Expression)角色:是抽象表達(dá)式的子類(lèi),用來(lái)實(shí)現(xiàn)文法中與終結(jié)符相關(guān)的操作,文法中的每一個(gè)終結(jié)符都有一個(gè)具體終結(jié)表達(dá)式與之相對(duì)應(yīng)。
非終結(jié)符解釋器(Nonterminal Expression)角色:也是抽象表達(dá)式的子類(lèi),用來(lái)實(shí)現(xiàn)文法中與非終結(jié)符相關(guān)的操作,文法中的每條規(guī)則都對(duì)應(yīng)于一個(gè)非終結(jié)符表達(dá)式。
環(huán)境(Context)角色:通常包含各個(gè)解釋器需要的數(shù)據(jù)或是公共的功能,一般用來(lái)傳遞被所有解釋器共享的數(shù)據(jù),后面的解釋器可以從這里獲取這些值。
解釋器模式類(lèi)結(jié)構(gòu)圖如圖所示:
二、實(shí)現(xiàn)
接下來(lái)針對(duì)四個(gè)角色分別定義他們的實(shí)現(xiàn)。
抽象解釋器:
/**
* 聲明一個(gè)抽象的解釋操作,這個(gè)接口為抽象語(yǔ)法樹(shù)中所有的節(jié)點(diǎn)所共享
* @author tcy
* @Date 29-08-2022
*/
public abstract class AbstractExpression {
public abstract boolean interpret(String info);
}非終結(jié)符表達(dá)式:
/**
* 非終結(jié)符表達(dá)式,為文法中的非終結(jié)符實(shí)現(xiàn)解釋操作。對(duì)文法中每一條規(guī)則R1、R2...Rn都需要一個(gè)具體的非終結(jié)符表達(dá)式類(lèi)
* @author tcy
* @Date 29-08-2022
*/
public class NonTerminalExpression extends AbstractExpression{
private AbstractExpression address=null;
private AbstractExpression name=null;
private AbstractExpression id=null;
public NonTerminalExpression(AbstractExpression address, AbstractExpression name, AbstractExpression id) {
this.address = address;
this.name = name;
this.id = id;
}
@Override
public boolean interpret(String info) {
String s[]=info.split("-");
return address.interpret(s[0])&&name.interpret(s[1])&&id.interpret(s[2]);
}
}終結(jié)符表達(dá)式:
**
* 實(shí)現(xiàn)與文法中的終結(jié)符相關(guān)聯(lián)的解釋操作,文法中每一個(gè)終結(jié)符都有一個(gè)具體終結(jié)表達(dá)式與之相對(duì)應(yīng)
* @author tcy
* @Date 29-08-2022
*/
public class TerminalExpression extends AbstractExpression{
private Set<String> set =new HashSet<String>();
public TerminalExpression(String[] data)
{
for(int i=0; i<data.length;i++)
set.add(data[i]);
}
@Override
public boolean interpret(String info) {
if(set.contains(info))
{
return true;
}
return false;
}
}上下文環(huán)境:
/**
* 上下文環(huán)境
* @author tcy
* @Date 29-08-2022
*/
public class Context {
private String[] shuzis={"1","2","3","4","5","6","7","8","9","0"};
private String[] xiaoxiezimus={"a","b","c","d","e","f","g","h","i","j","k","l"};
private String[] daxiezimus={"A","B","C","D","E","F","G"};
private AbstractExpression infomation;
public Context()
{
AbstractExpression shuzi=new TerminalExpression(shuzis);
AbstractExpression xiaoxiezimu=new TerminalExpression(xiaoxiezimus);
AbstractExpression daxiezimu=new TerminalExpression(daxiezimus);
infomation=new NonTerminalExpression(shuzi,xiaoxiezimu,daxiezimu);
}
public void jieshi(String info)
{
boolean ok=infomation.interpret(info);
if(ok) System.out.println("正確! ["+info+"] 滿足 [單個(gè)數(shù)字-單個(gè)小寫(xiě)-單個(gè)大寫(xiě)] 的條件");
else System.out.println("錯(cuò)誤! ["+info+"] 不滿足 [單個(gè)數(shù)字-單個(gè)小寫(xiě)-單個(gè)大寫(xiě)] 的條件");
}
}客戶端:
/**
* @author tcy
* @Date 29-08-2022
*/
public class Client {
public static void main(String[] args) {
Context people=new Context();
people.jieshi("2-a-A");
people.jieshi("11-A-5");
people.jieshi("你-好-吖");
people.jieshi("2aA");
}
}以上為解釋器模式的簡(jiǎn)單案例,讀者可以拉取代碼到本地進(jìn)行學(xué)習(xí),本地源碼下載。
三、應(yīng)用場(chǎng)景
解釋器模式在實(shí)際的軟件開(kāi)發(fā)中使用比較少,因?yàn)樗鼤?huì)引起效率、性能以及維護(hù)等問(wèn)題。
在JDK中的正則表達(dá)式中的Pattern類(lèi)和Spring里面的ExpressionParse接口使用的是解釋器模式的思想。
當(dāng)一個(gè)語(yǔ)言需要解釋執(zhí)行,并且語(yǔ)言中的句子可以表示為一個(gè)抽象語(yǔ)法樹(shù)的時(shí)候,如 XML 文檔解釋,整體來(lái)說(shuō)還是一種應(yīng)用較少的設(shè)計(jì)模式。
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
- 深入理解Java設(shè)計(jì)模式之解釋器模式
- 淺談Java解釋器模式
- Java設(shè)計(jì)模式之java解釋器模式詳解
- Java基于解釋器模式實(shí)現(xiàn)定義一種簡(jiǎn)單的語(yǔ)言功能示例
- Java設(shè)計(jì)模式之解釋器模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- Java設(shè)計(jì)模式編程之解釋器模式的簡(jiǎn)單講解
- 解析Java的設(shè)計(jì)模式編程之解釋器模式的運(yùn)用
- JAVA設(shè)計(jì)模式之解釋器模式詳解
- Java實(shí)現(xiàn)自定義語(yǔ)言和表達(dá)式解析的解釋器模式
相關(guān)文章
springMVC的RequestMapping請(qǐng)求不到路徑的解決
這篇文章主要介紹了springMVC的RequestMapping請(qǐng)求不到路徑的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
MyBatis?實(shí)現(xiàn)多對(duì)多中間表插入數(shù)據(jù)
這篇文章主要介紹了MyBatis?實(shí)現(xiàn)多對(duì)多中間表插入數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
SpringBoot自動(dòng)配置的8個(gè)技巧分享
在 SpringBoot 2.x中,一個(gè)很核心的功能是自動(dòng)配置機(jī)制,這篇文章主要為大家詳細(xì)介紹了Spring Boot 2.x 實(shí)現(xiàn)自動(dòng)配置的8個(gè)技巧,希望對(duì)大家有所幫助2025-01-01
Java.toCharArray()和charAt()的效率對(duì)比分析
這篇文章主要介紹了Java.toCharArray()和charAt()的效率對(duì)比分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10
Springboot+Mybatis實(shí)現(xiàn)分頁(yè)加條件查詢功能
這篇文章主要為大家詳細(xì)介紹了Springboot+Mybatis實(shí)現(xiàn)分頁(yè)加條件查詢,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
Java使用強(qiáng)大的Elastisearch搜索引擎實(shí)例代碼
本篇文章主要介紹了Java使用強(qiáng)大的Elastisearch搜索引擎實(shí)例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下2017-05-05


