设计模式(十七):解释器模式
优点:
① 如果一个特定问题发生频率够高,就值得将其实例表述(解释为)为一个简单语言的句子,如用正则表达式匹配手机号,油箱等
② 必须已有一种语言,之后,先定义其文法表示,然后定义其解释器,用解释器来解释此语言中的句子
缺点:
① 此模式为文法中的每一条规则至少定义了一个类,因此包含了许多规则的文法可能难以管理和维护。
适用范围:
特定类型的问题发生的频率足够高,就可以考虑将其表述为一个简单语言句子
客户端:
Content text = new Content();
//音乐-上海滩
System.out.println("上海滩:");
//待解释的音符串
text.setText("T 500 O 2 E 0.5 G 0.5 A 3 E 0.5 G 0.5 D 3 E 0.5 G 0.5 A 0.5 O 3 C 1 O 2 A 0.5 G 1 C 0.5 E 0.5 D 3 ");
//抽象解释器接口
AbstractExpression expression = null;
try {
while(text.getText().length()>0){
String str = text.getText().substring(0,1);
switch (str){
//演奏速度
case "T":
expression = new TerminalExpression3();
break;
//音阶
case "O":
expression = new TerminalExpression2();
break;
//音符
case "A":
case "B":
case "C":
case "D":
case "E":
case "F":
case "G":
expression = new TerminalExpression1();
break;
}
// 解释,每次截取一个字母+数值(即标识+值),不断循环截取解释
expression.interpret(text);
}
} catch (Exception e) {
e.printStackTrace();
}
//打印结果:
上海滩:
中速 中音 5 7 1 5 7 4 5 7 1 高音 3 中音 1 7 3 5 4
/** * AbstractExpression 抽象表达式类 (抽象解释类) -- 获取标识和值,及解释的方法,由实例化对其进行具体解释 * TerminalExpression1 TerminalExpression2 TerminalExpression3 (音符、音阶、演奏速度) NoTerminalExpression(其他) -- 都是AbstractExpression的实例化 * Content 演奏内容 -- 标识和值的集合 */