<h4 id="1定义">1.定义
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
<h4 id="2适用场景">2.适用场景
如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这一就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。
<h4 id="3优势">3.优势
可以很容易的扩展和改变文法,因为该模式使用类来表示文法规则,从而可以通过继承来改变和扩展语法。也比较容易实现文法,因为定义抽象语法树中各个节点的类的实现大体类似,这些类都易于直接编写。
<h4 id="4缺点">4.缺点
- 解释器模式为文法的每一条规则至少定义了一个类,因此包含许多规则的文法可能难以管理和维护。
- 建议当文法过于复杂时,使用其它的技术如语法分析程序or编译器生成器来处理。
<h4 id="6例子">6.例子
- 场景:给定一个字符串,代表一句歌词,歌词里面有音符、音阶、音速,这三者都是由两个元素组成:key和value。比如:音符,需要根据key来进行演奏,value是什么没有影响;音阶和音速则有value决定演奏什么信息;
- 音符:key为{A…G}中任一字母时,表示当前key-value组合为音符组合,故要进行音符的表演;
- 音阶:key=H时,表示当前key-value组合为音阶组合,故要进行音阶的表演;
- 音速:key=I时,表示当前key-value组合为音速组合,故要进行音速的表演。
- UML图
- code结构图
-
code;
代码如下
package designmodel.chapter27;
/**
- @Author: cxh
- @CreateTime: 18/3/13 19:44
- @ProjectName: JavaBaseTest
*/
public interface Expression {
default void commonExpress(String key,int value){
execute(key,value);
}
void execute(String key,int value);
}
package designmodel.chapter27
/**
* @Author: cxh
* @CreateTime: 18/3/13 20:22
* @ProjectName: JavaBaseTest
*/
//测试类
public class Main {
public static void main(String[] args) {
PlayText txt=
new PlayText("T 500 O 2 H 1 I 1 A 3 E 1 G 1 I 4 O 3 C 1 O 2 H 8 G 1 C 3 E 1 D 3");
String[] text=txt.toString().split(" ");
Expression exe=null;
for(int i=0;i<text.length;i+=2){
String key=text[i];
int value=Integer.valueOf(text[i+1]);
if(key.equals("H"))
exe=new Scale();
else if(key.equals("I"))
exe=new Speed();
else
exe=new Note();
//执行一对key-value解释行为
exe.commonExpress(key,value);
}
}
}
package designmodel.chapter27;
/**
- @Author: cxh
- @CreateTime: 18/3/13 19:59
- @ProjectName: JavaBaseTest
*/
//音符,根据key演奏音乐
public class Note implements Expression {
@Override
public void execute(String key,int 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;
}
//打印音符
System.out.print(note+" ");
}
}
package designmodel.chapter27;
/**
-
@Author: cxh
-
@CreateTime: 18/3/13 19:41
-
@ProjectName: JavaBaseTest
*/
public class PlayText {
String playText;
public PlayText(String text){
this.playText=text;
}
public String getPlayText() {
return playText;
}
@Override
public String toString() {
return playText;
}
}
package designmodel.chapter27;
/**
- @Author: cxh
- @CreateTime: 18/3/13 20:06
- @ProjectName: JavaBaseTest
*/
//音阶:根据value打印
public class Scale implements Expression{
//key始终为H
@Override
public void execute(String key,int value) {
String scale="";
switch (value){
case 1:
scale="低音";break;
case 2:
scale="中音";break;
case 3:
scale="高音";break;
}
//打印音阶
System.out.print(scale+" ");
}
}
package designmodel.chapter27;
/**
- @Author: cxh
- @CreateTime: 18/3/13 20:11
- @ProjectName: JavaBaseTest
*/
//音速:根据value值确定
public class Speed implements Expression {
//key始终为I
@Override
public void execute(String key,int value) {
String speed="";
if(value<500)
speed="低速";
else if(value<1000)
speed="中速";
else
speed="高速";
//打印音速
System.err.print(speed+" ");
}
}
参考书籍:《大话设计模式》-程杰
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。