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

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

 更新時間:2021年11月07日 11:35:17   作者:一指流砂~  
這篇文章主要介紹了JAVA設(shè)計模式之解釋器模式的的相關(guān)資料,文中示例代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解

一、什么是解釋器模式

定義:給定一個語言,定義一個文法的一種表示, 并定義一個解釋器, 這個解釋器使用該表示來解釋語言中的句子。

解釋器模式所涉及的角色如下所示:

(1)抽象表達(dá)式(Expression)角色:聲明一個所有的具體表達(dá)式角色都需要實現(xiàn)的抽象接口。這個接口主要是一個interpret()方法,稱做解釋操作。

(2)終結(jié)符表達(dá)式(Terminal Expression)角色:實現(xiàn)了抽象表達(dá)式角色所要求的接口,主要是一個interpret()方法;文法中的每一個終結(jié)符都有一個具體終結(jié)表達(dá)式與之相對應(yīng)。比如有一個簡單的公式R=R1+R2,在里面R1和R2就是終結(jié)符,對應(yīng)的解析R1和R2的解釋器就是終結(jié)符表達(dá)式。

(3)非終結(jié)符表達(dá)式(Nonterminal Expression)角色:文法中的每一條規(guī)則都需要一個具體的非終結(jié)符表達(dá)式,非終結(jié)符表達(dá)式一般是文法中的運(yùn)算符或者其他關(guān)鍵字,比如公式R=R1+R2中,“+"就是非終結(jié)符,解析“+”的解釋器就是一個非終結(jié)符表達(dá)式。

(4)環(huán)境(Context)角色:這個角色的任務(wù)一般是用來存放文法中各個終結(jié)符所對應(yīng)的具體值,比如R=R1+R2,我們給R1賦值100,給R2賦值200。這些信息需要存放到環(huán)境角色中,很多情況下我們使用Map來充當(dāng)環(huán)境角色就足夠了。

二、解釋器模式的使用場景

1.當(dāng)有一個語言需要解釋執(zhí)行,并且你可將該語言中的句子表示為一個抽象語法樹,可以使用解釋器模式。而當(dāng)存在以下情況時該模式效果最好

2.該文法的類層次結(jié)構(gòu)變得龐大而無法管理。此時語法分析程序生成器這樣的工具是最好的選擇。他們無需構(gòu)建抽象語法樹即可解釋表達(dá)式,這樣可以節(jié)省空間而且還可能節(jié)省時間。

3.效率不是一個關(guān)鍵問題,最高效的解釋器通常不是通過直接解釋語法分析樹實現(xiàn)的,而是首先將他們裝換成另一種形式,例如,正則表達(dá)式通常被裝換成狀態(tài)機(jī),即使在這種情況下,轉(zhuǎn)換器仍可用解釋器模式實現(xiàn),該模式仍是有用的

三、解釋器模式的優(yōu)缺點

優(yōu)點:

1. 可以很容易地改變和擴(kuò)展方法, 因為該模式使用類來表示方法規(guī)則, 你可以使用繼承來改變或擴(kuò)展該方法。

2.也比較容易實現(xiàn)方法, 因為定義抽象語法樹總各個節(jié)點的類的實現(xiàn)大體類似, 這些類都易于直接編寫。

3.解釋器模式就是將一句話,轉(zhuǎn)變?yōu)閷嶋H的命令程序執(zhí)行而已。 而不用解釋器模式本身也可以分析, 但通過繼承抽象表達(dá)式的方式, 由于依賴轉(zhuǎn)置原則, 使得文法的擴(kuò)展和維護(hù)都帶來的方便。

缺點:

解釋器模式為方法中的每一條規(guī)則至少定義了一個類, 因此包含許多規(guī)則的方法可能難以管理和維護(hù)。 因此當(dāng)方法非常復(fù)雜時, 使用其他的技術(shù)如 語法分析程序 或 編譯器生成器來處理。

四、解釋器模式的實現(xiàn)

音樂解釋器

演奏內(nèi)容類(Context)

//演奏內(nèi)容類(Context)
class PlayContext
{
    //演奏文本
    private string text;
    public string PlayText
    {
        get { return text; }
        set { text = value; }
    }
}

表達(dá)式類(AbstractExpression)

//表達(dá)式類(AbstractExpression)
abstract class Expression
{
    //解釋器
    public void Interpret(PlayContext context)
    {
        if (context.PlayText.Length == 0) return;
        string playKey = context.PlayText.Substring(0, 1);
        context.PlayText = context.PlayText.Substring(2);
        double playValue = Convert.ToDouble(context.PlayText.Substring(0, context.PlayText.IndexOf(" ")));
        context.PlayText = context.PlayText.Substring(context.PlayText.IndexOf(" ") + 1);
         Excute(playKey, playValue);
    }
    //執(zhí)行
    public abstract void Excute(string key, double value);
}

音符類(TerminaExperssion)

//音符類(TerminaExperssion)
class Note : Expression
{
    public override void Excute(string key, double value)
    {
        string note = "";
        switch (key)
        {
            case "C":
                note = "1";
                break;
            case "D":
                note = "2";
                break;
            case "E":
                note = "3";
                break;
            case "F":
                note = "4";
                break;
            case "G":
                note = "5";
                break;
            case "A":
                note = "6";
                break;
            case "B":
                note = "7";
                break;
        }
     }
}
//音符類(TerminaExperssion)
class Scale : Expression
{
    public override void Excute(string key, double value)
    {
        string scale = "";
        switch ((int)value)
        {
            case 1:
                scale = "低音";
                break;
            case 2:
                scale = "中音";
                break;
            case 3:
                scale = "高音";
                break;
        }
     }
}

客戶端代碼

class Program
{
    //客戶端代碼
    static void Main(string[] args)
    {
        PlayContext context = new PlayContext();
        context.PlayText = "O 2 E 0.5 G 0.5 A 3 E 0.5";
        Expression expression = null;
        try
        {
            while (context.PlayText.Length > 0)
            {
                string str = context.PlayText.Substring(0, 1);
                switch (str)
                {
                    case "O":
                        expression = new Scale();
                        break;
                    case "P"://當(dāng)首字母為CDEFGAB及休止符P時,實例化音符
                        expression = new Note();
                        break;
                }
                expression.Interpret(context);
            }
        }
        catch (Exception )
        {
             throw;
        }
         Console.Read();
    }
}

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • springboot項目賬戶注冊邏輯功能實現(xiàn)

    springboot項目賬戶注冊邏輯功能實現(xiàn)

    這篇文章主要介紹了springboot項目賬戶注冊邏輯功能實現(xiàn),本文通過實例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2024-12-12
  • Java 異常處理小結(jié),從入門到精通

    Java 異常處理小結(jié),從入門到精通

    這篇文章主要介紹了Java 異常處理小結(jié),從入門到精通,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • 大數(shù)組元素差異removeAll與Map效率對比

    大數(shù)組元素差異removeAll與Map效率對比

    這篇文章主要介紹了大數(shù)組元素差異removeAll與Map效率對比,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • java中的equals()和toString()方法實例詳解

    java中的equals()和toString()方法實例詳解

    這篇文章主要介紹了java中的equals()和toString()方法實例詳解的相關(guān)資料,這里舉例說明,并附實例代碼,和實現(xiàn)效果圖,需要的朋友可以參考下
    2016-11-11
  • 解決get請求入?yún)NotNull驗證不生效問題

    解決get請求入?yún)NotNull驗證不生效問題

    這篇文章主要介紹了解決get請求入?yún)NotNull驗證不生效問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Springboot集成jdbcTemplate過程解析

    Springboot集成jdbcTemplate過程解析

    這篇文章主要介紹了Springboot集成jdbcTemplate過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • 全面解釋java中StringBuilder、StringBuffer、String類之間的關(guān)系

    全面解釋java中StringBuilder、StringBuffer、String類之間的關(guān)系

    String的值是不可變的,這就導(dǎo)致每次對String的操作都會生成新的String對象,不僅效率低下,而且大量浪費(fèi)有限的內(nèi)存空間,StringBuffer是可變類,和線程安全的字符串操作類,任何對它指向的字符串的操作都不會產(chǎn)生新的對象,StringBuffer和StringBuilder類功能基本相似
    2013-01-01
  • MyBatis還是JPA?終于有答案了

    MyBatis還是JPA?終于有答案了

    這篇文章主要介紹了MyBatis還是JPA,中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Java List集合去重的多種實現(xiàn)方法

    Java List集合去重的多種實現(xiàn)方法

    Java中List集合去重的多種方法,包括使用循環(huán)、HashSet、保持順序去重、contain方法去重等,注意在刪除元素時,直接操作會導(dǎo)致ConcurrentModificationException,應(yīng)使用傳統(tǒng)for循環(huán)或倒序刪除
    2025-02-02
  • Java Collections.shuffle()方法案例詳解

    Java Collections.shuffle()方法案例詳解

    這篇文章主要介紹了Java Collections.shuffle()方法案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08

最新評論

安丘市| 富平县| 沁源县| 砚山县| 南华县| 湖南省| 监利县| 沁源县| 城固县| 明溪县| 石首市| 景谷| 邵东县| 河津市| 玉门市| 化德县| 祁东县| 麟游县| 洪江市| 福安市| 广南县| 织金县| 榆树市| 平顺县| 治多县| 黄龙县| 于田县| 昭觉县| 炎陵县| 平山县| 孟津县| 苏尼特左旗| 长治县| 额敏县| 扬中市| 福海县| 东台市| 巴中市| 扎兰屯市| 延吉市| 化隆|