解釋器模式 - 明天考試剿吻,戳不輟進(jìn)來(lái)你自己看著辦

1 介紹


Acey:考試臨近了窍箍,你復(fù)習(xí)的怎么樣啦?小白丽旅。

小白:??椰棘,word哥呀,真的好險(xiǎn)呀榄笙,考了三門了邪狞,都是飄過(guò)的你造嘛!

Acey: 你這是考場(chǎng)老司機(jī)呀茅撞,專注60分一輩子帆卓,多一分就是浪費(fèi)呀是吧?

小白:

Acey:好吧米丘,不說(shuō)你了鳞疲,后面的科目可別掛了??。今天呢蠕蚜,我們來(lái)用解釋器模式來(lái)算算你一共考了多少分。

小白:那我用計(jì)算器算不就好了悔橄。,,???,,

Acey:那顯得多l(xiāng)ow呀靶累,簡(jiǎn)單的四則運(yùn)算當(dāng)然可以用計(jì)算器,但是當(dāng)以后用到更復(fù)雜的運(yùn)算時(shí)計(jì)算器就解決不了癣疟,所以為了以后挣柬,現(xiàn)在要好好的學(xué)。

小白:好啵睛挚。

解釋器模式:Interpreter 模式是行為模式的一種邪蛔。簡(jiǎn)單的說(shuō)就是一種語(yǔ)法解釋器架構(gòu)。

Acey:說(shuō)的通俗易懂一點(diǎn)扎狱。我們?cè)谑褂糜?jì)算器的時(shí)候侧到,通常就是按下相應(yīng)的數(shù)字運(yùn)算符勃教,然后結(jié)果就顯示出來(lái)了,整個(gè)被隱藏起來(lái)的運(yùn)算過(guò)程就是對(duì)應(yīng)的解釋器解釋過(guò)程匠抗。而對(duì)于我們要算的總成績(jī)也是一個(gè)道理故源,我們只需要將科目及對(duì)應(yīng)的分?jǐn)?shù)輸入,經(jīng)過(guò)解釋器的解釋汞贸,我們就可以得到我們想要的結(jié)果绳军,這就是解釋器模式

小白:這樣呀矢腻,那如果我們要進(jìn)行規(guī)模比較大的運(yùn)算门驾,如 統(tǒng)計(jì),預(yù)測(cè)之類的多柑,使用解釋器模式會(huì)不會(huì)比較影響效率哇奶是。??

Acey:會(huì)呢,因?yàn)槲覀兪遣捎眠f歸調(diào)用的方式顷蟆,所以如果程序需要高效的話诫隅,建議就不要使用了。

2 實(shí)現(xiàn)


先帐偎,我們先來(lái)看看結(jié)構(gòu)類圖

類圖

其中

  • AbstractExpression 是一個(gè)抽象表達(dá)式類逐纬,具體的解釋任務(wù)由各個(gè)實(shí)現(xiàn)類完成。
  • TerminalExpression是終結(jié)符表達(dá)式類削樊,實(shí)現(xiàn)相關(guān)的解釋操作(獲取當(dāng)前科目分?jǐn)?shù))
  • NonterminalExpression 是非終結(jié)符表達(dá)式類豁生,每條規(guī)則對(duì)應(yīng)于一個(gè)非終結(jié)表達(dá)式(相應(yīng)的運(yùn)算)
  • Context是上下文角色,用來(lái)存儲(chǔ)輸入的數(shù)據(jù)(科目及分?jǐn)?shù))漫贞。

實(shí)現(xiàn)

一步:創(chuàng)建抽象表達(dá)式角色

Expression.class

//抽象表達(dá)式角色
public abstract class Expression {
    public abstract Integer result(Context context);
}

二步:創(chuàng)建上下文角色

Context.class

//上下文角色甸箱,使用HashMap來(lái)存儲(chǔ)變量及其對(duì)應(yīng)的值
public class Context {
    //用于保存科目及相應(yīng)的分?jǐn)?shù)
    private Map<Subject,Integer> score = new HashMap<>();
    
    //為每門課填充分?jǐn)?shù)
    public void addScore(Subject subject, Integer score){
        this.score.put(subject, score);
    }
    
    //獲取科目對(duì)應(yīng)的分?jǐn)?shù)
    public Integer getScore(Subject subject){
        return this.score.get(subject);
    }
    
}

三步:創(chuàng)建終結(jié)符角色

Subject.class


//終結(jié)符表達(dá)式角色
public class Subject extends Expression{

    //從context(Map)中獲取當(dāng)前科目的分?jǐn)?shù)
    @Override
    public Integer result(Context context) {
        return context.getScore(this);
    }

}

四步:創(chuàng)建非終結(jié)符角色

Add.class

//非終結(jié)者表達(dá)式角色
public class Add extends Expression{
    private Expression left;
    private Expression right;
    
    //傳入兩門科目名稱
    public Add(Expression left, Expression right) {
        this.left = left;
        this.right = right;
    }

    //計(jì)算結(jié)果
    @Override
    public Integer result(Context context) {
        return left.result(context) + right.result(context);
    }

}

五步:測(cè)試

Mainclass.class

public class MainClass {
    public static void main(String[] args) {
        //容器,存放科目及其對(duì)應(yīng)分?jǐn)?shù)
        Context context = new Context();
        
        //創(chuàng)建科目
        Subject math = new Subject();
        Subject chinese = new Subject();
        Subject english = new Subject();
        
        //保存分?jǐn)?shù)
        context.addScore(math, 61);
        context.addScore(chinese, 60);
        context.addScore(english, 65);
        
        //迭代計(jì)算總分?jǐn)?shù)
        Expression result = new Add(new Add(math, chinese), english) ;
        
        System.out.println("總分?jǐn)?shù)為:" + result.result(context));
        
    }
}
運(yùn)行結(jié)果

Acey:上述代碼中只實(shí)現(xiàn)了一個(gè)非終結(jié)符表達(dá)式迅脐,當(dāng)然根據(jù)需求可以很輕易的添加芍殖,它的優(yōu)點(diǎn)就是拓展性強(qiáng)。但是缺點(diǎn)也是很明顯的谴蔑,每條規(guī)則(運(yùn)算符)都要對(duì)應(yīng)一個(gè)非終結(jié)符表達(dá)式豌骏,當(dāng)業(yè)務(wù)復(fù)雜時(shí),存在大量的非終結(jié)符表達(dá)式隐锭,那維護(hù)起來(lái)就相當(dāng)麻煩了窃躲。模式中使用了遞歸也是一個(gè)不容小覷的缺點(diǎn),當(dāng)運(yùn)行解釋冗長(zhǎng)钦睡、復(fù)雜的語(yǔ)句時(shí)效率往往是很低的蒂窒,也不利于開(kāi)發(fā)人的調(diào)試。所以在開(kāi)發(fā)中解釋器模式一般也很少用到。

last

祝大家

喜歡的話戳一下喜歡唄洒琢。
有什么建議的話希望大家能在下方回復(fù)??
上一篇:《適配器模式 - 我有金卡秧秉,你有麼?》
下一篇:《中介者模式 - 聽(tīng)說(shuō)你還是單身dog》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末纬凤,一起剝皮案震驚了整個(gè)濱河市福贞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌停士,老刑警劉巖挖帘,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異恋技,居然都是意外死亡拇舀,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門蜻底,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)骄崩,“玉大人,你說(shuō)我怎么就攤上這事薄辅∫鳎” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵站楚,是天一觀的道長(zhǎng)脱惰。 經(jīng)常有香客問(wèn)我,道長(zhǎng)窿春,這世上最難降的妖魔是什么拉一? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮旧乞,結(jié)果婚禮上蔚润,老公的妹妹穿的比我還像新娘。我一直安慰自己尺栖,他們只是感情好嫡纠,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著延赌,像睡著了一般货徙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上皮胡,一...
    開(kāi)封第一講書(shū)人閱讀 49,929評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音赏迟,去河邊找鬼屡贺。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的甩栈。 我是一名探鬼主播泻仙,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼量没!你這毒婦竟也來(lái)了玉转?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤殴蹄,失蹤者是張志新(化名)和其女友劉穎究抓,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體袭灯,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡刺下,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了稽荧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片橘茉。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖姨丈,靈堂內(nèi)的尸體忽然破棺而出畅卓,到底是詐尸還是另有隱情,我是刑警寧澤蟋恬,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布翁潘,位于F島的核電站,受9級(jí)特大地震影響筋现,放射性物質(zhì)發(fā)生泄漏唐础。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一矾飞、第九天 我趴在偏房一處隱蔽的房頂上張望一膨。 院中可真熱鬧,春花似錦洒沦、人聲如沸豹绪。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)瞒津。三九已至,卻和暖如春括尸,著一層夾襖步出監(jiān)牢的瞬間巷蚪,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工濒翻, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留屁柏,地道東北人啦膜。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像淌喻,于是被迫代替她去往敵國(guó)和親僧家。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 1 場(chǎng)景問(wèn)題# 1.1 讀取配置文件## 考慮這樣一個(gè)實(shí)際的應(yīng)用裸删,維護(hù)系統(tǒng)自定義的配置文件八拱。 幾乎每個(gè)實(shí)際的應(yīng)用系...
    七寸知架構(gòu)閱讀 3,095評(píng)論 2 56
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理戳葵,服務(wù)發(fā)現(xiàn)圃泡,斷路器笨腥,智...
    卡卡羅2017閱讀 134,637評(píng)論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法汞舱,類相關(guān)的語(yǔ)法志衣,內(nèi)部類的語(yǔ)法茫负,繼承相關(guān)的語(yǔ)法荚守,異常的語(yǔ)法端铛,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,599評(píng)論 18 399
  • 天空本該是藍(lán)色的每聪, 既不熱情也不冷峻旦棉。 如同最老套的劇情, 最普通的米飯药薯, 最不起眼的你绑洛。 劇情老套的電影永遠(yuǎn)有人...
    七年樹(shù)閱讀 256評(píng)論 0 2
  • 看完第二遍楊德昌的電影《一一》,我覺(jué)得要寫點(diǎn)什么泵额,為了紀(jì)念這部我個(gè)人認(rèn)為偉大的電影之一配深,說(shuō)它偉大,其實(shí)更多還是來(lái)源...
    九林蜀黍閱讀 1,290評(píng)論 0 1