大话设计模式之解释器模式——行为型

定义:

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

自己理解:
   解释器顾名思义在一定的规则下解释东西,比如在战争时期用电报互通消息而不想让别人知道内容,就会先约定制成一个密码本作为载体,然后约定一些规则,这样如果你不知道'密码本'那么电报的内容你就不知道,这种传递消息的过程就是运用解释器模式,我觉得像各种各样的字典翻译也都算是解释器模式!(PS:纯属个人见解)

优缺点:

    解释器模式提供了一个简单的方式来执行语法,而且容易修改或者扩展语法。一般系统中很多类使用相似的语法,可以使用一个解释器来代替为每一个规则实现一个解释器。而且在解释器中不同的规则是由不同的类来实现的,这样使得添加一个新的语法规则变得简单。
    但是解释器模式对于复杂文法难以维护。可以想象一下,每一个规则要对应一个处理类,而且这些类还要递归调用抽象表达式角色,多如乱麻的类交织在一起是多么恐怖的一件事啊!

小例子:

  书上的小例子——音乐解释器
   代码实现:
 //演奏内容
    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:Expression 
    {
        public override 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;
            }

            Console.Write("{0} ", note);
        }
    }

//音阶类
    class Scale: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;
            }
            Console.Write("{0} ",scale );
        }
    }

客户端代码:
PlayContext context = new PlayContext();
            //音乐-上海滩
            Console.WriteLine("上海滩: ");
context.PlayText = "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 "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);
            }
            Console.Read();
        }
   运行结果:
  
 
   错误:
   但是我在实现的过程中遇到了小错误,其中客户端代码中有一行代码:
   错误1:
context.PlayText = "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"; 

   结果:
  

  错误2:
context.PlayText = " 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 "; 
  
  结果:
  

 分析原因:
 其实当报这种错的时候我查了查原因第一个错误可能是:传递参数的过程中出现了错误 导致字符串没有包含,第二个出错的原因感觉解释的都不是太恰当,具体表现就是‘空格’。

 总结:

 在写代码的过程中还是要细心点儿,同时也因为这次的出错了解了错误和出错点儿,也算小有收获!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值