加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

第27章《解释器模式》

发布时间:2020-12-13 20:56:28 所属栏目:百科 来源:网络整理
导读:h4 id="1定义"1.定义 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 h4 id="2适用场景"2.适用场景 如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的

<h4 id="1定义">1.定义

给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

<h4 id="2适用场景">2.适用场景

如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这一就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。

<h4 id="3优势">3.优势

可以很容易的扩展和改变文法,因为该模式使用类来表示文法规则,从而可以通过继承来改变和扩展语法。也比较容易实现文法,因为定义抽象语法树中各个节点的类的实现大体类似,这些类都易于直接编写。

<h4 id="4缺点">4.缺点

  • 解释器模式为文法的每一条规则至少定义了一个类,因此包含许多规则的文法可能难以管理和维护。
  • 建议当文法过于复杂时,使用其它的技术如语法分析程序or编译器生成器来处理。

这里写图片描述

<h4 id="6例子">6.例子

  • 场景:给定一个字符串,代表一句歌词,歌词里面有音符、音阶、音速,这三者都是由两个元素组成:key和value。比如:音符,需要根据key来进行演奏,value是什么没有影响;音阶和音速则有value决定演奏什么信息;
    • 音符:key为{A…G}中任一字母时,表示当前key-value组合为音符组合,故要进行音符的表演;
    • 音阶:key=H时,表示当前key-value组合为音阶组合,故要进行音阶的表演;
    • 音速:key=I时,表示当前key-value组合为音速组合,故要进行音速的表演。
  • UML图 这里写图片描述
  • code结构图 这里写图片描述
  • code; 代码如下


    package designmodel.chapter27;
    

    /**

    • @Author: cxh
    • @CreateTime: 18/3/13 19:44
    • @ProjectName: JavaBaseTest
      */
      public interface Expression {
      default void commonExpress(String key,int value){
      execute(key,value);
      }
      void execute(String key,int value);
      }

     package designmodel.chapter27
    /**
     * @Author: cxh
     * @CreateTime: 18/3/13 20:22
     * @ProjectName: JavaBaseTest
     */
    //测试类
    public class Main {
public static void main(String[] args) {
    PlayText txt=
      new PlayText("T 500 O 2 H 1 I 1 A 3 E 1 G 1 I 4 O 3 C 1 O 2 H 8 G 1 C 3 E 1 D 3");
String[] text=txt.toString().split(" ");
Expression exe=null;
for(int i=0;i<text.length;i+=2){
    String key=text[i];
    int value=Integer.valueOf(text[i+1]);
    if(key.equals("H"))
        exe=new Scale();
    else if(key.equals("I"))
        exe=new Speed();
    else
        exe=new Note();
    //执行一对key-value解释行为
    exe.commonExpress(key,value);
    }
}

}


package designmodel.chapter27;

/**

  • @Author: cxh
  • @CreateTime: 18/3/13 19:59
  • @ProjectName: JavaBaseTest
    */
    //音符,根据key演奏音乐
    public class Note implements Expression {
    @Override
    public void execute(String key,int value) {
    String note="";
    switch (key){
    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 designmodel.chapter27;

/**

  • @Author: cxh

  • @CreateTime: 18/3/13 19:41

  • @ProjectName: JavaBaseTest
    */
    public class PlayText {
    String playText;
    public PlayText(String text){
    this.playText=text;
    }
    public String getPlayText() {
    return playText;
    }

    @Override
    public String toString() {
    return playText;
    }
    }


package designmodel.chapter27;

/**

  • @Author: cxh
  • @CreateTime: 18/3/13 20:06
  • @ProjectName: JavaBaseTest
    */
    //音阶:根据value打印
    public class Scale implements Expression{
    //key始终为H
    @Override
    public void execute(String key,int value) {
    String scale="";
    switch (value){
    case 1:
    scale="低音";break;
    case 2:
    scale="中音";break;
    case 3:
    scale="高音";break;
    }
    //打印音阶
    System.out.print(scale+" ");
    }
    }

package designmodel.chapter27;

/**

  • @Author: cxh
  • @CreateTime: 18/3/13 20:11
  • @ProjectName: JavaBaseTest
    */
    //音速:根据value值确定
    public class Speed implements Expression {
    //key始终为I
    @Override
    public void execute(String key,int value) {
    String speed="";
    if(value<500)
    speed="低速";
    else if(value<1000)
    speed="中速";
    else
    speed="高速";
    //打印音速
    System.err.print(speed+" ");
    }
    }

参考书籍:《大话设计模式》-程杰

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读