版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/q1052196521/article/details/79742934
源码git地址 https://github.com/dlovetco/designMode
有时候我们会遇到这样的一个问题:客户端能够提供的参数并不是我们所需要的。在调用正确的api之前,我们需要先把客户端传进来的参数解析成我们所需要的格式。
问题的提出
音乐简谱中描绘乐曲用的是1234567,而实际发出的声音却是“哆瑞咪发嗦啦西”。实现一个简谱到音乐的转译系统。
解释器模式
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
package interpretermode;
import java.util.Arrays;
public class InterpreterMode {
public static void main(String[] args) {
Context context = new Context();
context.setText("1 2 3 4 5 6 7");
Expression note = new Note();
note.execute(context);
}
}
/**
* 文法表达式接口
*/
interface Expression {
void execute(Context context);
}
/**
* 音符类 进行具体的音符转换
*/
class Note implements Expression {
@Override
public void execute(Context context) {
String[] keys = context.getText().split(" ");
Arrays.stream(keys).forEach(key -> {
switch (key) {
case "1":
System.out.println("do");
break;
case "2":
System.out.println("re");
break;
case "3":
System.out.println("mi");
break;
case "4":
System.out.println("fa");
break;
case "5":
System.out.println("so");
break;
case "6":
System.out.println("la");
break;
case "7":
System.out.println("xi");
break;
}
});
}
}
/**
* 待解释的文本
*/
class Context {
private String text;
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
我这边写的例子比较简单,解释器的子类只写了一个。复杂一点的话可以写多个文法解释类,然后在客户端根据条件实例化不同的子类进行解释。
使用了解释器模式就意味着可以很容易地改变和扩展文法,因为该模式使用类来表示文法规则,你可使用继承来改变或扩展该文法。
解释器模式不足的地方在于:解释器模式为文法中的每一条规则至少定义了一个类,因此包含许多规则的文法可能难以管理和维护。
plantuml
@startuml
interface Expression{
{abstract}execute(Context context)
}
Expression <|.. Note
class Note{
execute(Context context)
}
Context <.. Expression
class Context{
string text
}
@enduml