解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
抽象实例
User.java
public class Context {
private String input;
private String output;
public String getInput() {
return input;
}
public void setInput(String input) {
this.input = input;
}
public String getOutput() {
return output;
}
public void setOutput(String output) {
this.output = output;
}
}
AbstractExpression.java-解释器
package zx.interpreter.test1;
public abstract class AbstractExpression {
/**
* 声明一个抽象的解释操作
* @param context
*/
public abstract void interpret(Context context);
}
class TerminalExpression extends AbstractExpression{
@Override
public void interpret(Context context) {
System.out.println("终端解释器");
}
}
class NonterminalExpression extends AbstractExpression{
@Override
public void interpret(Context context) {
System.out.println("非终端解释器");
}
}
Test.java
package zx.interpreter.test1;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
Context context = new Context();
List<AbstractExpression> list = new ArrayList<AbstractExpression>();
list.add(new TerminalExpression());
list.add(new NonterminalExpression());
list.add(new TerminalExpression());
list.add(new TerminalExpression());
for(AbstractExpression ae:list){
ae.interpret(context);
}
}
}
输出
具体实例:音乐解释器
规则:我们定义O表示音阶,O1表示低音阶,O2表示中音阶,O3表示高音阶,P表示休止符C-D-E-F-G-A-B表示Do-Re-Mi-Fa-So-La-Si,音节长度1表示一拍,2表示2拍,0.5表示半拍,0.25表示四分之一拍。
例如:O 2 E 0.5 G 0.5 A 3表示中音开始,演奏的是mi so la
PlayContext.java
public class PlayContext {
//演奏文本
private String text;
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
AbstractExpression.java
public abstract class AbstractExpression {
//解释器
public void interpret(PlayContext context){
if(context.getText().length()==0){
return ;
}else{
/**
* 例如 O 3 E 0.5 G 0.5 A 3
* 则playKey为O playValue为3
*/
String playKey=context.getText().substring(0,1);
context.setText(context.getText().substring(2));
double playValue=Double.valueOf(
context.getText().substring(0, context.getText().indexOf(" ")));
context.setText(context.getText().substring(
context.getText().indexOf(" ")+1));
execute(playKey,playValue);
}
}
public abstract void execute(String playKey, double playValue);
}
/**
* @author zhu_xiang
* Description:音符类
*/
class Note extends AbstractExpression{
@Override
public void execute(String playKey, double playValue) {
String note="";
switch(playKey){
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;
default:break;
}
System.out.print(note+" ");
}
}
class Scale extends AbstractExpression{
@Override
public void execute(String playKey, double playValue) {
String scale="";
switch((int)playValue){
case 1:scale="低音";break;
case 2:scale="中音";break;
case 3:scale="高音";break;
default:break;
}
System.out.print(scale+" ");
}
}
/**
*
* @author zhu_xiang
* Description:T代表速度,以毫秒为单位,T 1000 表示每节拍1秒,T 500表示每节拍半秒
*/
class Speed extends AbstractExpression{
@Override
public void execute(String playKey, double playValue) {
String speed;
if(playValue<500){
speed="快速";
}else if(playValue>=1000){
speed="慢速";
}else{
speed="中速";
}
System.out.print(speed+" ");
}
}
Test.java
public class Test {
public static void main(String[] args) {
PlayContext playContext = new PlayContext();
System.out.println("上海滩: ");
playContext.setText("T 1000 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(playContext.getText().length()>0){
String str=playContext.getText().substring(0,1);
switch(str){
case "T":expression=new Speed();break;
case "O":expression=new Scale();break;
case "C":
case "D":
case "E":
case "F":
case "G":
case "A":
case "B":expression=new Note();break;
default:break;
}
expression.interpret(playContext);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}