Android設(shè)計模式-解釋器模式

UML關(guān)系簡單介紹
UML簡單使用的介紹
創(chuàng)建型設(shè)計模式
Android設(shè)計模式-單例模式
Android設(shè)計模式-工廠模式
Android設(shè)計模式-抽象工廠模式
Android設(shè)計模式-建造者模式
Android設(shè)計模式-原型模式
結(jié)構(gòu)型設(shè)計模式
Android設(shè)計模式-代理模式
Android設(shè)計模式-裝飾模式
Android設(shè)計模式-適配器模式
Android設(shè)計模式-組合模式
Android設(shè)計模式-門面模式
Android設(shè)計模式-橋接模式
Android設(shè)計模式-享元模式
行為型設(shè)計模式
Android設(shè)計模式-策略模式
Android設(shè)計模式-命令模式
Android設(shè)計模式-責(zé)任鏈模式
Android設(shè)計模式-模版方法模式
Android設(shè)計模式-迭代器模式
Android設(shè)計模式-觀察者模式
Android設(shè)計模式-備忘錄模式
Android設(shè)計模式-中介者模式
Android設(shè)計模式-訪問者模式
Android設(shè)計模式-狀態(tài)模式
Android設(shè)計模式-解釋器模式

1.定義

給定一門語言谢鹊,定義它的文法的一種表示,并定義一個解釋器雇盖,該解釋器使用該表示來解釋語言中的句子真屯。

2.解釋器模式UML圖

解釋器模式UML圖

角色介紹

  • Context 環(huán)境角色 上下文環(huán)境類沛贪,包含解釋器之外的全局信息
  • AbstractExpression 抽象表達(dá)式 具體的解釋任務(wù)由各個實現(xiàn)類完成
  • TerminalExpression 終結(jié)符表達(dá)式 實現(xiàn)與文法中的元素相關(guān)聯(lián)的解釋操作,通常一個解釋器模式只有一個終結(jié)符表達(dá)式,但有多個實例革娄。
  • NonterminalExpression 非終結(jié)符表達(dá)式 文法中的每條規(guī)則對應(yīng)于一個非終結(jié)表達(dá)式,非終結(jié)表達(dá)式根據(jù)邏輯的復(fù)雜程度而增加冕碟,原則上每個文法規(guī)則都對應(yīng)一個非終結(jié)表達(dá)式拦惋。
    簡單舉例說明,例如 c=a+b,a b就是終結(jié)符表達(dá)式安寺,+則是非終結(jié)符表達(dá)式厕妖。對應(yīng)的解析a和b的解釋器就是終結(jié)符表達(dá)式,解析+的解釋器就是一個非終結(jié)符表達(dá)式

3.簡單實現(xiàn)

就以一個簡單的運算來做例子

3.1抽象表達(dá)式

public abstract class AbstractExpression {
    public abstract int interpreter(Context context);
}

3.2終結(jié)符表達(dá)式

public class VarExpression extends AbstractExpression {
    private  String key;

    public VarExpression(String key) {
        this.key = key;
    }

    @Override
    public int interpreter(Context context) {
        return context.getValue(key);
    }
}

3.3非終結(jié)符表達(dá)式

public class AddExpression extends AbstractExpression {
    private AbstractExpression left;

    private AbstractExpression right;

    public AddExpression(AbstractExpression left, AbstractExpression right) {
        this.left = left;
        this.right = right;
    }

    @Override
    public int interpreter(Context context) {
        return left.interpreter(context)+right.interpreter(context);
    }
}

public class SubtractExpression extends AbstractExpression {
    private AbstractExpression left;

    private AbstractExpression right;

    public SubtractExpression(AbstractExpression left, AbstractExpression right) {
        this.left = left;
        this.right = right;
    }

    @Override
    public int interpreter(Context context) {
        return left.interpreter(context)-right.interpreter(context);
    }
}

public class MultiplyExpression extends AbstractExpression {
    private AbstractExpression left;

    private AbstractExpression right;

    public MultiplyExpression(AbstractExpression left, AbstractExpression right) {
        this.left = left;
        this.right = right;
    }

    @Override
    public int interpreter(Context context) {
        return left.interpreter(context)*right.interpreter(context);
    }
}

public class DivisionExpression extends AbstractExpression {
    private AbstractExpression left;

    private AbstractExpression right;

    public DivisionExpression(AbstractExpression left, AbstractExpression right) {
        this.left = left;
        this.right = right;
    }

    @Override
    public int interpreter(Context context) {
        return left.interpreter(context)/right.interpreter(context);
    }
}

3.4環(huán)境角色

public class Context {
    private final Map<String, Integer> valueMap = new HashMap<>();

    public void add(final String key, final int value) {
        valueMap.put(key, Integer.valueOf(value));
    }

    public int getValue(final String key) {
        return valueMap.get(key).intValue();
    }
}

3.5客戶端調(diào)用

public class MyClass {
    public static void main(String args[]) {
        Context context = new Context();
        context.add("a", 5);
        context.add("b", 6);
        context.add("c", 7);

        VarExpression a = new VarExpression("a");
        VarExpression b = new VarExpression("b");
        VarExpression c = new VarExpression("c");
        
        AbstractExpression multiplyValue = new MultiplyExpression(a, b);
        AbstractExpression subtractValue = new SubtractExpression(a, b);
        AbstractExpression addValue = new AddExpression(subtractValue, c);
        AbstractExpression divisionValue = new DivisionExpression(multiplyValue, addValue);

        System.out.println(divisionValue.interpreter(context));

    }
}

打印結(jié)果為

5

上述例子其實就是在做 ab/(a-b+c),放入代碼中應(yīng)該很容易看懂

4.總結(jié)

優(yōu)點

  • 良好的擴(kuò)展性挑庶,修改和擴(kuò)展文法規(guī)則時言秸,只需要修改或添加對應(yīng)的非終結(jié)表達(dá)式。

缺點

  • 每條文法都對應(yīng)解釋器迎捺,類必然會很多

使用場景

  • 重復(fù)發(fā)生的問題举畸,可以使用解釋器,例如四則運算凳枝,大小寫轉(zhuǎn)換等場景抄沮,就是不斷重復(fù)的問題
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市岖瑰,隨后出現(xiàn)的幾起案子叛买,更是在濱河造成了極大的恐慌,老刑警劉巖蹋订,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件聪全,死亡現(xiàn)場離奇詭異,居然都是意外死亡辅辩,警方通過查閱死者的電腦和手機(jī)难礼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進(jìn)店門娃圆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蛾茉,你說我怎么就攤上這事讼呢。” “怎么了谦炬?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵悦屏,是天一觀的道長。 經(jīng)常有香客問我键思,道長础爬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任吼鳞,我火速辦了婚禮看蚜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赔桌。我一直安慰自己供炎,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布疾党。 她就那樣靜靜地躺著音诫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪雪位。 梳的紋絲不亂的頭發(fā)上竭钝,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天,我揣著相機(jī)與錄音雹洗,去河邊找鬼蜓氨。 笑死,一個胖子當(dāng)著我的面吹牛队伟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播幽勒,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼嗜侮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了啥容?” 一聲冷哼從身側(cè)響起锈颗,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎咪惠,沒想到半個月后击吱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡遥昧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年覆醇,在試婚紗的時候發(fā)現(xiàn)自己被綠了朵纷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡永脓,死狀恐怖袍辞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情常摧,我是刑警寧澤搅吁,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站落午,受9級特大地震影響谎懦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜溃斋,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一界拦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盐类,春花似錦寞奸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至猫妙,卻和暖如春瓷翻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背割坠。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工齐帚, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人彼哼。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓对妄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親敢朱。 傳聞我的和親對象是個殘疾皇子剪菱,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,509評論 2 348