解释器模式

解释器模式

定义

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

适合场景

通常当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器。

优点

容易改变和扩展文法,因为该模式使用类来表示文法规则,可以使用继承来改变或扩展该文法,也较容易实现文法,因为定义抽象树中的各个节点的类的实现大体类似,因此类易于编写。

缺点

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

UML图

在这里插入图片描述

用例

音乐解释器

演奏内容

class PlayContext{
    //演奏文本
    private string text;
    public string PlayText{
        get { return text; }
        set { text = value; }
    }
}

表达式

abstract class Expression{
    //解释器
    public void Interpret(PlayContext context){
        if (context.PlayText.Length == 0)
            return;
        else{
            string playKey = context.PlayText.Substring(0, 1);
            context.PlayText = context.PlayText.Substring(2);
            double playValue = Convert.ToDouble(context.PlayText.Substring(0, context.PlayText.IndexOf(" ")));
            context.PlayText = context.PlayText.Substring(context.PlayText.IndexOf(" ") + 1);
            Excute(playKey, playValue);
        }
    }
    //执行
    public abstract void excute(string key, double value);
}

音符

class Note extends Expression{
	@override
    public void excute(string key, double 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;

        }
    }
}

音阶

class Scale extends Expression{
    public override void Excute(string key, double value){
        string scale = "";
        switch (Convert.ToInt32(value)){
            case 1:
                scale = "低音";
                break;
            case 2:
                scale = "中音";
                break;
            case 3:
                scale = "高音";
                break;
        }
    }
}

音速

音速
class Speed : Expression{
    public override void Excute(string key, double value){
        string speed;
        if (value < 500)
            speed = "快速";
        else if (value >= 1000)
            speed = "慢速";
        else
            speed = "中速";
    }
}

客户端

static void Main(string[] args){
    PlayContext context = new PlayContext();
    //音乐-上海滩
    Console.WriteLine("上海滩:");
    context.PlayText = "T 500 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 ";
    Expression expression = null;
    try{
        while (context.PlayText.Length > 0){
            string str = context.PlayText.Substring(0, 1);
            switch (str){
                case "O":
                    expression = new Scale();
                    break;
                case "T":
                    expression = new Speed();
                    break;
                case "C":
                case "D":
                case "E":
                case "F":
                case "G":
                case "A":
                case "B":
                case "P":
                    expression = new Note();
                    break;
            }
            expression.Interpret(context);
        }
    }
    catch (Exception ex){
        Console.WriteLine(ex.Message);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值