1 package com.shejimoshi.behavioral.Interpreter; 2 3 4 /** 5 * 功能:演奏文本 6 * 時間:2016年3月3日上午9:26:19 7 * 作者:cutter_point 8 */ 9 public class PlayContext 1
1 package com.shejimoshi.behavioral.Interpreter; 2 3 4 /** 5 * 功能:演奏文本 6 * 時間:2016年3月3日上午9:26:19 7 * 作者:cutter_point 8 */ 9 public class PlayContext 10 { 11 private String text; 12 13 public PlayContext() 14 { 15 } 16 17 public PlayContext(String text) 18 { 19 this.text = text; 20 } 21 22 public String getText() 23 { 24 return text; 25 } 26 27 public void setText(String text) 28 { 29 this.text = text; 30 } 31 32 }
1 package com.shejimoshi.behavioral.Interpreter; 2 3 4 /** 5 * 功能:抽象表達式 6 * 時間:2016年3月3日上午9:28:02 7 * 作者:cutter_point 8 */ 9 public abstract class AbstractExpress 10 { 11 //解釋器,吧我們的表達式進行分解 12 public void interpret(PlayContext context) 13 { 14 if(context.getText().length() == 0) 15 { 16 return; //這個表示表達式長度為0,沒有需要處理的 17 } 18 else 19 { 20 //這裡吧 O 3 E 0.5 G 0.5 A 3 轉化為 E 0.5 G 0.5 A 3 21 String playKey = context.getText().substring(0, 1); 22 context.setText(context.getText().substring(2)); //3 E 0.5 G 0.5 A 3 23 String playValue = context.getText().substring(0, context.getText().indexOf(" ")); 24 context.setText(context.getText().substring(context.getText().indexOf(" ") + 1)); //E 0.5 G 0.5 A 3 25 26 //執行解釋器 27 excute(playKey, playValue); 28 } 29 } 30 31 public abstract void excute(String playKey, String playValue); 32 }
1 package com.shejimoshi.behavioral.Interpreter; 2 3 4 /** 5 * 功能:音符類 6 * 時間:2016年3月3日上午9:40:33 7 * 作者:cutter_point 8 */ 9 public class Note extends AbstractExpress 10 { 11 12 @Override 13 public void excute(String playKey, String playValue) 14 { 15 String note = ""; 16 switch(playKey) 17 { 18 case "C": 19 note = "1"; 20 break; 21 case "D": 22 note = "2"; 23 break; 24 case "E": 25 note = "3"; 26 break; 27 case "F": 28 note = "4"; 29 break; 30 case "G": 31 note = "5"; 32 break; 33 case "A": 34 note = "6"; 35 break; 36 case "B": 37 note = "7"; 38 break; 39 } 40 41 System.out.print(note + " "); 42 } 43 }
1 package com.shejimoshi.behavioral.Interpreter; 2 3 4 /** 5 * 功能:音符類 6 * 時間:2016年3月3日上午9:48:49 7 * 作者:cutter_point 8 */ 9 public class Scale extends AbstractExpress 10 { 11 12 @Override 13 public void excute(String playKey, String playValue) 14 { 15 String scale = ""; 16 switch(playValue) 17 { 18 case "1": 19 scale = "低音"; 20 break; 21 case "2": 22 scale = "中音"; 23 break; 24 case "3": 25 scale = "高音"; 26 break; 27 } 28 29 System.out.print(scale + " "); 30 } 31 32 }
1 package com.shejimoshi.behavioral.Interpreter; 2 3 4 /** 5 * 功能:解釋器模式,給定一個語言,定義它的文法的一種表示,並定義一個解釋器,這個解釋器使用該表示來解釋語句中的句子 6 * 適用:當有一個有一個簡單的語法規則,比如一個sql語句,如果我們需要根據sql語句進行rm轉換,就可以使用解釋器模式來對語句進行解釋。 7 一些重覆發生的問題,比如加減乘除四則運算,但是公式每次都不同,有時是a+b-c*d,有時是a*b+c-d,等等等等個,公式千變萬化, 8 但是都是由加減乘除四個非終結符來連接的,這時我們就可以使用解釋器模式。 9 * 時間:2016年3月3日上午8:43:58 10 * 作者:cutter_point 11 */ 12 public class Test 13 { 14 public static void main(String[] args) 15 { 16 // String str = "tes asd"; 17 // System.out.println(str.substring(2)); 18 // System.out.println(str.substring(1, 3)); 19 PlayContext text = new PlayContext(); 20 //上海灘 21 System.out.println("上海灘"); 22 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 "); 23 AbstractExpress expression = null; 24 try 25 { 26 while(text.getText().length() > 0) 27 { 28 //這裡分解字元串 29 String str = text.getText().substring(0, 1); 30 switch(str) 31 { 32 case "O": 33 expression = new Scale(); 34 break; 35 default: 36 expression = new Note(); 37 break; 38 }//switch 39 expression.interpret(text); 40 } 41 } 42 catch (Exception e) 43 { 44 e.printStackTrace(); 45 } 46 } 47 }
測試結果:
上海灘 中音 3 5 6 3 5 2 3 5 6 高音 1 中音 6 5 1 3 2