解释器模式

来源:互联网 发布:程序员考试下午真题 编辑:程序博客网 时间:2024/06/06 03:03

实例:

实现一个简单的音乐解释器


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 : 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);        }    }    //音速    class Speed : Expression    {        public override void Excute(string key, double value)        {            string speed;            if (value < 500)                speed = "快速";            else if (value >= 1000)                speed = "慢速";            else                speed = "中速";            Console.Write("{0} ", speed);        }    }


客户端代码:


            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);            }            Console.Read();


说明:


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


不足:解释器模式为文法中的每一条规则至少定义了一个类,因此包含许多规则的文法可能难以管理和维护。解释器模式在实际的系统开发中使用的很少,因为他会引起效率、性能以及维护等问题。




参考资料

-《大话设计模式》


0 0