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

 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

  

时间: 2024-10-05 05:06:16

【设计模式】15.解释器模式的相关文章

大话设计模式_解释器模式(Java代码)

解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 简单描述:一个AbstractExpression类,多个子类,存在一个Interpret方法,转义Context对象的信息.客户端根据信息实例化不同的Expression类,并调用其转义方法(这个过程可以使用简单工厂+反射进行) 大话设计模式中的截图: 代码例子: 假设HTML代码解释器: (1)第一类标签<HTML>(开始)/<HEAD>(头信息)/<BODY&g

设计模式之解释器模式(Interpreter)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

GOF23设计模式之解释器模式和访问器模式的理解

设计模式之解释器模式Interpreter      是一种不常用的设计模式      用于描述如何构成一个简单的语言解释器,主要用于使用面向对象语言开发的编译器和解释器设计.      当我们需要开发一种新的语言时,可以考虑使用解释器模式.      尽量不要使用解释器模式,后期维护会有很大麻烦.在项目中可以使用jruby,Groovy,java的js引擎来代替解释器的作用,弥补java语言的不足. 开发中常见的场景:      EL表达式的处理      正则表达式解释器      SQL语

c++设计模式15 --组合模式

今天研究了一下设计模式15 组合模式 本人是菜鸟一枚,所以一开始完全不懂组合究竟是什么意思.先上图一张,树形结构图: 文档说,如果想做出这样的结构,通常考虑组合模式.那是为什么呢?现在让我们看一下组合模式的类图一本结构 想了很久,结合源代码,才搞明白,其实这个组合,意思就是说,如果我们要做这种树状结果,比如公司想让我们吧所有部门人员的 姓名,职位,薪水遍历出来,这个时候怎么办呢?那我们看树状机构图,有叶子结点和枝干结点,2种,但是2种有共性,那就是每个结点都有姓名,职位,薪水.所有叶子结点和枝干

C#设计模式(15)——命令模式(Command Pattern)

原文:C#设计模式(15)--命令模式(Command Pattern) 一.前言 之前一直在忙于工作上的事情,关于设计模式系列一直没更新,最近项目中发现,对于设计模式的了解是必不可少的,当然对于设计模式的应用那更是重要,可以说是否懂得应用设计模式在项目中是衡量一个程序员的技术水平,因为对于一个功能的实现,高级工程师和初级工程师一样都会实现,但是区别在于它们实现功能的可扩展和可维护性,也就是代码的是否“优美”.可读.但是,要更好地应用,首先就必须了解各种设计模式和其应用场景,所以我还是希望继续完

C#设计模式:解释器模式(Interpreter Pattern)

一,C#设计模式:解释器模式(Interpreter Pattern) 1,解释器模式的应用场合是Interpreter模式应用中的难点,只有满足“业务规则频繁变化,且类似的模式不断重复出现,并且容易抽象为语法规则的问题”才适合使用解释器模式2,解释器设计模式每个解释的类有自己的规则,并且与其他业务规则不冲突 二,如下代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; u

Head First设计模式之解释器模式

一.定义 给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子. 主要解决:对于一些固定文法构建一个解释句子的解释器. 何时使用:如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子.这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题. 如何解决:构件语法树,定义终结符与非终结符. 二.结构 组成: AbstractExpression(抽象表达式):定义解释器的接口,约定解释器的解释操作. Termi

php设计模式之解释器模式

解释器设计模式用于分析一个实体的关键元素,并且针对每个元素都提供自己的解释或相应的动作. <?php /** * 解释器模式 */ class User { protected $_username; public function __construct($username) { $this->_username = $username; } public function getProfilePage() { $profile = "<h2>I like never

设计模式(27)-----解释器模式

解释器模式(interpreter) 定义 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. UML类图 角色 抽象表达式(Expression)角色:声明一个所有的具体表达式角色都需要实现的抽象接口.这个接口主要是一个interpret()方法,称做解释操作. 终结符表达式(Terminal Expression)角色:实现了抽象表达式角色所要求的接口,主要是一个interpret()方法:文法中的每一个终结符都有一个具体终结表达式与之相对应.比