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圖
角色介紹
- 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ù)的問題