最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java設(shè)計模式之解釋器模式

 更新時間:2022年10月11日 09:09:15   作者:tianClassmate  
這篇文章介紹了Java設(shè)計模式之解釋器模式,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

解釋器模式字面意思,也即解釋某些內(nèi)容的含義。這種設(shè)計模式是實(shí)際開發(fā)中最不容易用到的。比如SQL解析,符號處理引擎,會用到解釋器模式,屬于更底層的開發(fā)人員才會用到的設(shè)計模式。

本文就以解釋器模式的概念、角色和簡單的例子說明解釋器模式,讀者對這部分內(nèi)容了解即可。

一、概念

解釋器模式是指給定一門語言,定義它的文法的一種表示(如:加減乘除表達(dá)式和正則表達(dá)式等),然后再定義一個解釋器,該解釋器用來解釋我們的文法表示(表達(dá)式)。

解釋器模式的結(jié)構(gòu)與組合模式相似,不過其包含的組成元素比組合模式多,而且組合模式是對象結(jié)構(gòu)型模式,而解釋器模式是類行為型模式。

解釋器模式中包含四個角色:

  • 抽象解釋器(Abstract Expression)角色:定義解釋器的接口,約定解釋器的解釋操作,主要包含解釋方法 interpret()。

  • 終結(jié)符解釋器(Terminal Expression)角色:是抽象表達(dá)式的子類,用來實(shí)現(xiàn)文法中與終結(jié)符相關(guān)的操作,文法中的每一個終結(jié)符都有一個具體終結(jié)表達(dá)式與之相對應(yīng)。

  • 非終結(jié)符解釋器(Nonterminal Expression)角色:也是抽象表達(dá)式的子類,用來實(shí)現(xiàn)文法中與非終結(jié)符相關(guān)的操作,文法中的每條規(guī)則都對應(yīng)于一個非終結(jié)符表達(dá)式。

  • 環(huán)境(Context)角色:通常包含各個解釋器需要的數(shù)據(jù)或是公共的功能,一般用來傳遞被所有解釋器共享的數(shù)據(jù),后面的解釋器可以從這里獲取這些值。

    解釋器模式類結(jié)構(gòu)圖如圖所示:

二、實(shí)現(xiàn)

接下來針對四個角色分別定義他們的實(shí)現(xiàn)。

抽象解釋器:

/**
 * 聲明一個抽象的解釋操作,這個接口為抽象語法樹中所有的節(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)解釋操作。對文法中每一條規(guī)則R1、R2...Rn都需要一個具體的非終結(jié)符表達(dá)式類
 * @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)的解釋操作,文法中每一個終結(jié)符都有一個具體終結(jié)表達(dá)式與之相對應(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+"] 滿足  [單個數(shù)字-單個小寫-單個大寫]  的條件");
        else System.out.println("錯誤! ["+info+"] 不滿足  [單個數(shù)字-單個小寫-單個大寫]  的條件");
    }

}

客戶端:

/**
 * @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");

    }
}

以上為解釋器模式的簡單案例,讀者可以拉取代碼到本地進(jìn)行學(xué)習(xí),本地源碼下載。

三、應(yīng)用場景

解釋器模式在實(shí)際的軟件開發(fā)中使用比較少,因?yàn)樗鼤鹦?、性能以及維護(hù)等問題。

在JDK中的正則表達(dá)式中的Pattern類和Spring里面的ExpressionParse接口使用的是解釋器模式的思想。

當(dāng)一個語言需要解釋執(zhí)行,并且語言中的句子可以表示為一個抽象語法樹的時候,如 XML 文檔解釋,整體來說還是一種應(yīng)用較少的設(shè)計模式。

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接

相關(guān)文章

  • Java流處理stream使用詳解

    Java流處理stream使用詳解

    Java8的另一大亮點(diǎn)Stream,它與java.io包里的InputStream和OutputStream是完全不同的概念,下面這篇文章主要給大家介紹了關(guān)于Java8中Stream詳細(xì)使用方法的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • springMVC的RequestMapping請求不到路徑的解決

    springMVC的RequestMapping請求不到路徑的解決

    這篇文章主要介紹了springMVC的RequestMapping請求不到路徑的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • MyBatis?實(shí)現(xiàn)多對多中間表插入數(shù)據(jù)

    MyBatis?實(shí)現(xiàn)多對多中間表插入數(shù)據(jù)

    這篇文章主要介紹了MyBatis?實(shí)現(xiàn)多對多中間表插入數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 小項(xiàng)目改造快速引入 mybatis的流程分析

    小項(xiàng)目改造快速引入 mybatis的流程分析

    這篇文章主要介紹了小項(xiàng)目改造快速引入 mybatis,功能方面非常簡單,考慮到開發(fā)速度,直接按 springboot 項(xiàng)目進(jìn)行開發(fā),依賴方面僅僅使用 spring-boot-starter-web, spring-boot-starter-jdbc, sqljdbc4, lombook,需要的朋友可以參考下
    2022-05-05
  • SpringBoot自動配置的8個技巧分享

    SpringBoot自動配置的8個技巧分享

    在 SpringBoot 2.x中,一個很核心的功能是自動配置機(jī)制,這篇文章主要為大家詳細(xì)介紹了Spring Boot 2.x 實(shí)現(xiàn)自動配置的8個技巧,希望對大家有所幫助
    2025-01-01
  • Spring IOC與DI核心深入理解

    Spring IOC與DI核心深入理解

    IOC也是Spring的核心之一了,之前學(xué)的時候是采用xml配置文件的方式去實(shí)現(xiàn)的,后來其中也多少穿插了幾個注解,但是沒有說完全采用注解實(shí)現(xiàn)。那么這篇文章就和大家分享一下,全部采用注解來實(shí)現(xiàn)IOC+DI
    2023-02-02
  • 搭建公司私有MAVEN倉庫的方法

    搭建公司私有MAVEN倉庫的方法

    這篇文章主要介紹了搭建公司私有MAVEN倉庫的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Java.toCharArray()和charAt()的效率對比分析

    Java.toCharArray()和charAt()的效率對比分析

    這篇文章主要介紹了Java.toCharArray()和charAt()的效率對比分析,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • Springboot+Mybatis實(shí)現(xiàn)分頁加條件查詢功能

    Springboot+Mybatis實(shí)現(xiàn)分頁加條件查詢功能

    這篇文章主要為大家詳細(xì)介紹了Springboot+Mybatis實(shí)現(xiàn)分頁加條件查詢,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Java使用強(qiáng)大的Elastisearch搜索引擎實(shí)例代碼

    Java使用強(qiáng)大的Elastisearch搜索引擎實(shí)例代碼

    本篇文章主要介紹了Java使用強(qiáng)大的Elastisearch搜索引擎實(shí)例代碼,具有一定的參考價值,有興趣的可以了解一下
    2017-05-05

最新評論

隆安县| 平泉县| 德化县| 佛山市| 临漳县| 綦江县| 五常市| 黄浦区| 新乡市| 博客| 连城县| 吴堡县| 区。| 都匀市| 手游| 巴林左旗| 镇远县| 普兰县| 安顺市| 陆良县| 文成县| 丹寨县| 蒙山县| 易门县| 寿光市| 荣昌县| 六盘水市| 龙江县| 五河县| 阜新市| 公安县| 海盐县| 长兴县| 宣汉县| 福清市| 鄄城县| 沾益县| 嫩江县| 乌拉特中旗| 洮南市| 积石山|