您的位置:首页 > 其它

【设计模式】15.解释器模式

2016-03-03 10:06 423 查看


package com.shejimoshi.behavioral.Interpreter;

/**
* 功能:演奏文本
* 时间:2016年3月3日上午9:26:19
* 作者:cutter_point
*/
public class PlayContext
{
private String text;

public PlayContext()
{
}

public PlayContext(String text)
{
this.text = text;
}

public String getText()
{
return text;
}

public void setText(String text)
{
this.text = text;
}

}


package com.shejimoshi.behavioral.Interpreter;

/**
* 功能:抽象表达式
* 时间:2016年3月3日上午9:28:02
* 作者:cutter_point
*/
public abstract class AbstractExpress
{
//解释器,吧我们的表达式进行分解
public void interpret(PlayContext context)
{
if(context.getText().length() == 0)
{
return;    //这个表示表达式长度为0,没有需要处理的
}
else
{
//这里吧 O 3 E 0.5 G 0.5 A 3 转化为 E 0.5 G 0.5 A 3
String playKey = context.getText().substring(0, 1);
context.setText(context.getText().substring(2));    //3 E 0.5 G 0.5 A 3
String playValue = context.getText().substring(0, context.getText().indexOf(" "));
context.setText(context.getText().substring(context.getText().indexOf(" ") + 1));    //E 0.5 G 0.5 A 3

//执行解释器
excute(playKey, playValue);
}
}

public abstract void excute(String playKey, String playValue);
}


package com.shejimoshi.behavioral.Interpreter;

/**
* 功能:音符类
* 时间:2016年3月3日上午9:40:33
* 作者:cutter_point
*/
public class Note extends AbstractExpress
{

@Override
public void excute(String playKey, String 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;
}

System.out.print(note + " ");
}
}


package com.shejimoshi.behavioral.Interpreter;

/**
* 功能:音符类
* 时间:2016年3月3日上午9:48:49
* 作者:cutter_point
*/
public class Scale extends AbstractExpress
{

@Override
public void excute(String playKey, String playValue)
{
String scale = "";
switch(playValue)
{
case "1":
scale = "低音";
break;
case "2":
scale = "中音";
break;
case "3":
scale = "高音";
break;
}

System.out.print(scale + " ");
}

}


package com.shejimoshi.behavioral.Interpreter;

/**
* 功能:解释器模式,给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语句中的句子
* 适用:当有一个有一个简单的语法规则,比如一个sql语句,如果我们需要根据sql语句进行rm转换,就可以使用解释器模式来对语句进行解释。
一些重复发生的问题,比如加减乘除四则运算,但是公式每次都不同,有时是a+b-c*d,有时是a*b+c-d,等等等等个,公式千变万化,
但是都是由加减乘除四个非终结符来连接的,这时我们就可以使用解释器模式。
* 时间:2016年3月3日上午8:43:58
* 作者:cutter_point
*/
public class Test
{
public static void main(String[] args)
{
//        String str = "tes asd";
//        System.out.println(str.substring(2));
//        System.out.println(str.substring(1, 3));
PlayContext text = new PlayContext();
//上海滩
System.out.println("上海滩");
text.setText("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 ");
AbstractExpress expression = null;
try
{
while(text.getText().length() > 0)
{
//这里分解字符串
String str = text.getText().substring(0, 1);
switch(str)
{
case "O":
expression = new Scale();
break;
default:
expression = new Note();
break;
}//switch
expression.interpret(text);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}


测试结果:

上海滩
中音 3 5 6 3 5 2 3 5 6 高音 1 中音 6 5 1 3 2


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: