【設計模式】15.解釋器模式

来源:http://www.cnblogs.com/cutter-point/archive/2016/03/03/5237469.html
-Advertisement-
Play Games

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 

  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • php中讀取文件可以使用fopen和file_get_contents這兩個函數,二者之間沒有本質區別,只是前者讀取文件的php代碼相比後者要複雜一點。本文章通過實例向大家講解fopen和file_get_contents讀取文件的實現代碼。需要的碼農可以參考一下。 fopen讀取文件的代碼如下:
  • Java 異常處理方法 Java catch多個異常處理 Java Finally實例 Java 如何使用 catch 處理異常 Java 多線程異常處理實例 Java 如何獲取異常的堆棧信息 Java 重載方法異常處理 Java 鏈試異常實例 Java 如何自定義異常處理
  • 學習maven項目時 搭建個ssm項目 算是給自己留個備份吧 環境說明: MyEclipse10 Maven 3.2.3 框架: struts2 2.3.24.1 spring3 3.0.5.RELEASE mybatis 3.2.2 資料庫: mysql 5.7 <project xmlns="h
  • 所謂“單例”: 單例模式是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中一個類只有一個實例而且該實例易於外界訪問,從而方便對實例個數的控制並節約系統資源。如果希望在系統中某個類的對象只能存在一個,單例模式是最好的解決方案。 C#中的例子: 轉:htt
  • 1 package com.shejimoshi.behavioral.Iterator; 2 3 4 /** 5 * 功能:我們的迭代器介面 6 * 時間:2016年3月4日上午9:17:36 7 * 作者:cutter_point 8 */ 9 public interface MyIterat
  • 1、概念:裝飾模式是在不必改變原類文件和使用繼承的情況下,動態的擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象,又叫做包裝模式。 2、在java的IO流這個章節中,我們會發現有底層流,比如說位元組和字元流,有緩衝流等等: FileOutputStream:基本的文件輸出流 B
  • 引言 用過ASP.NET WebApi2.0, 上次去面試被問到什麼是Restful ,一時間竟不知道從何說起,所以搜集資料,做個備註,有時間好多來看看加深理解。 什麼是Restful 一種軟體架構風格,設計風格而不是標準,只是提供了一組設計原則和約束條件。它主要用於客戶端和伺服器交互類的軟體。基於
  • 面向對象原則綜述 七大原則總脈絡圖: 註:1,2,3,4,5顯示的重要等級 常用的面向對象設計原則包括7個,這些原則並不是孤立存在的,它們相互依賴,相互補充。 下麵就是面向對象七個原則的一一解析 一、開閉原則 1. 開閉原則定義 :一個軟體實體應當對擴展開放,對修改關閉。也就是說在設計一個模塊的時候
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...