【设计模式】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
相关文章推荐
- 网站用户行为数据挖掘
- symbol not found 是怎么回事啊?
- 千兆以太网的物理层
- Git for windows 中文乱码解决方案
- 《从零开始学Swift》学习笔记(Day 38)——构造函数与存储属性初始化
- css3兼容IE8的方案 各个ie的hack
- 您的 App 正在使用广告标识符 (IDFA)
- Spark常见问题汇总
- 3529: [Sdoi2014]数表 莫比乌斯反演+树状数组
- [转载]CSS居中完全指南
- IOS UIStepper(步进控件)使用总结
- Ubuntu15.10下华南师大锐捷认证客户端的使用详解
- C语言函数参数为空和void
- this关键字
- 如何同时支持leftBarButtonItem及右滑返回手势
- LINK : fatal error LNK1181: 无法打开输入文件“a.lib,b.lib” 可能原因是什么?
- Qt入门-加入资源文件
- iOS 拨打电话
- SSAS快速入门
- RecycleView出现折叠效果--第三方开源--SectionedExpandableGridRecyclerView