解释器模式

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

抽象实例

User.java

public class Context {

    private String input;
    private String output;
    public String getInput() {
        return input;
    }
    public void setInput(String input) {
        this.input = input;
    }
    public String getOutput() {
        return output;
    }
    public void setOutput(String output) {
        this.output = output;
    }

}

AbstractExpression.java-解释器

package zx.interpreter.test1;

public abstract class AbstractExpression {
    /**
     * 声明一个抽象的解释操作
     * @param context
     */
    public abstract void interpret(Context context);

}

class TerminalExpression extends AbstractExpression{

    @Override
    public void interpret(Context context) {
        System.out.println("终端解释器");
    }
}

class NonterminalExpression extends AbstractExpression{

    @Override
    public void interpret(Context context) {
        System.out.println("非终端解释器");
    }
}

Test.java

package zx.interpreter.test1;

import java.util.ArrayList;
import java.util.List;

public class Test {

    public static void main(String[] args) {
        Context context = new Context();
        List<AbstractExpression> list = new ArrayList<AbstractExpression>();

        list.add(new TerminalExpression());
        list.add(new NonterminalExpression());
        list.add(new TerminalExpression());
        list.add(new TerminalExpression());

        for(AbstractExpression ae:list){
            ae.interpret(context);
        }

    }

}

输出

具体实例:音乐解释器


规则:我们定义O表示音阶,O1表示低音阶,O2表示中音阶,O3表示高音阶,P表示休止符C-D-E-F-G-A-B表示Do-Re-Mi-Fa-So-La-Si,音节长度1表示一拍,2表示2拍,0.5表示半拍,0.25表示四分之一拍。
例如:O 2 E 0.5 G 0.5 A 3表示中音开始,演奏的是mi so la

PlayContext.java

public class PlayContext {

    //演奏文本
    private String text;

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }


}

AbstractExpression.java

public abstract class AbstractExpression {

    //解释器
    public void interpret(PlayContext context){
        if(context.getText().length()==0){
            return ;
        }else{
            /**
             * 例如 O 3 E 0.5 G 0.5 A 3
             * 则playKey为O playValue为3 
             */
            String playKey=context.getText().substring(0,1);
            context.setText(context.getText().substring(2));
            double playValue=Double.valueOf(
                    context.getText().substring(0, context.getText().indexOf(" ")));
            context.setText(context.getText().substring(
                    context.getText().indexOf(" ")+1));
            execute(playKey,playValue);

        }
    }

    public abstract void execute(String playKey, double playValue); 

}

/**
 * @author zhu_xiang 
 * Description:音符类
 */
class Note extends AbstractExpression{

    @Override
    public void execute(String playKey, double 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;
            default:break;
        }
        System.out.print(note+" ");
    }
}

class Scale extends AbstractExpression{

    @Override
    public void execute(String playKey, double playValue) {
        String scale="";
        switch((int)playValue){
            case 1:scale="低音";break;
            case 2:scale="中音";break;
            case 3:scale="高音";break;
            default:break;
        }
        System.out.print(scale+" ");
    }

}

/**
 * 
 * @author zhu_xiang 
 * Description:T代表速度,以毫秒为单位,T 1000 表示每节拍1秒,T 500表示每节拍半秒
 */
class Speed extends AbstractExpression{

    @Override
    public void execute(String playKey, double playValue) {
        String speed;
        if(playValue<500){
            speed="快速";
        }else if(playValue>=1000){
            speed="慢速";
        }else{
            speed="中速";
        }
        System.out.print(speed+" ");
    }

}

Test.java

public class Test {

    public static void main(String[] args) {
        PlayContext playContext = new PlayContext();
        System.out.println("上海滩: ");
        playContext.setText("T 1000 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 ");
        AbstractExpression expression=null;

        try {
            while(playContext.getText().length()>0){
                String str=playContext.getText().substring(0,1);
                switch(str){
                case "T":expression=new Speed();break;
                case "O":expression=new Scale();break;
                case "C":
                case "D":
                case "E":
                case "F":
                case "G":
                case "A":
                case "B":expression=new Note();break;
                default:break;
                }
                expression.interpret(playContext);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
解释器模式是一种行为型设计模式,它用于将一种语言的语法表示为一个解释器,以便通过解释器来执行特定的操作。在Java中,解释器模式可以用于解析和执行特定的文法规则。 在解释器模式中,我们定义了一个接口或抽象类来表示语言的文法规则,并为每个文法规则定义了一个具体的解释器解释器接受一个表达式,并对其进行解释执行。 Java中的解释器模式通常使用递归下降解析器来实现。递归下降解析器通过递归地从顶层规则开始,逐步解析语法树上的各个节点,最终完成整个语法分析过程。 下面是一个简单的示例,演示了如何使用解释器模式来解析并执行一个简单的表达式语言: ```java // 抽象表达式类 interface Expression { int interpret(); } // 终结符表达式类 class NumberExpression implements Expression { private int number; public NumberExpression(int number) { this.number = number; } @Override public int interpret() { return number; } } // 非终结符表达式类 class AddExpression implements Expression { private Expression left; private Expression right; public AddExpression(Expression left, Expression right) { this.left = left; this.right = right; } @Override public int interpret() { return left.interpret() + right.interpret(); } } // 客户端代码 public class Client { public static void main(String[] args) { // 构建语法树 Expression expression = new AddExpression( new NumberExpression(10), new AddExpression( new NumberExpression(5), new NumberExpression(3) ) ); // 执行解释器 int result = expression.interpret(); System.out.println(result); // 输出: 18 } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值