解释器模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解释器模式相关的知识,希望对你有一定的参考价值。

解释器模式就类似百度翻译,还有就是模板引擎,加密算法等。

就是在不控的情况下,输入的内容不能确定。按照一定的规律来生成结果

特点如下:

1、需求(对于百度翻译来说、输入的内容在开发时不能确定。加密算法也是一样,用户要加密什么内容。你在编程时不知道,所以要动态处理)不确定

2、按规律来翻译内容

例子中,将用户输入的内容字母小写转大写、数字变成汉字输出

代码如下:

抽象出表达式抽像类,抽像的仅供方法。

    public abstract class BaseExpression
    {
        public abstract void Translate(Context context);
    }

表达式:

  public class WordExpression : BaseExpression
    {
        static Dictionary<string, string> DictionaryExpression = new Dictionary<string, string>();
        public WordExpression()
        {
            DictionaryExpression.Add("a", "A");
            DictionaryExpression.Add("b", "B");

            DictionaryExpression.Add("c", "C");
            DictionaryExpression.Add("d", "D");

            DictionaryExpression.Add("e", "E");
            DictionaryExpression.Add("f", "F");

            DictionaryExpression.Add("g", "G");
            DictionaryExpression.Add("h", "H");

            DictionaryExpression.Add("i", "I");
            DictionaryExpression.Add("j", "J");

            DictionaryExpression.Add("k", "K");
            DictionaryExpression.Add("l", "L");

            DictionaryExpression.Add("m", "M");
            DictionaryExpression.Add("n", "N");

            DictionaryExpression.Add("o", "O");
            DictionaryExpression.Add("p", "P");

            DictionaryExpression.Add("q", "Q");
            DictionaryExpression.Add("r", "R");

            DictionaryExpression.Add("s", "S");
            DictionaryExpression.Add("t", "T");

            DictionaryExpression.Add("u", "U");
            DictionaryExpression.Add("v", "V");

            DictionaryExpression.Add("w", "W");
            DictionaryExpression.Add("x", "X");

            DictionaryExpression.Add("y", "Y");
            DictionaryExpression.Add("z", "Z");
        }
        public override void Translate(Context context)
        {
            List<string> SourceText = context.SourceText.ToCharArray().Select(w => w.ToString()).ToList();

            List<string> ResultText = new List<string>();

            foreach (string item in SourceText)
            {
                if (DictionaryExpression.ContainsKey(item))
                {
                    ResultText.Add(DictionaryExpression[item]);
                }
                else
                {
                    ResultText.Add(item);
                }
            }
            context.SourceText = string.Concat(ResultText);
        }
    }
    public class NumberExpression : BaseExpression
    {

        static Dictionary<string, string> DictionaryExpression = new Dictionary<string, string>();

        public NumberExpression()
        {
            DictionaryExpression.Add("0", "");
            DictionaryExpression.Add("1", "");
            DictionaryExpression.Add("2", "");

            DictionaryExpression.Add("3", "");
            DictionaryExpression.Add("4", "");
            DictionaryExpression.Add("5", "");

            DictionaryExpression.Add("6", "");
            DictionaryExpression.Add("7", "");
            DictionaryExpression.Add("8", "");
            DictionaryExpression.Add("9", "");
        }

        public override void Translate(Context context)
        {
            List<string> SourceText = context.SourceText.ToCharArray().Select(w=>w.ToString()).ToList();

            List<string> ResultText = new List<string>();

            foreach (string item in SourceText)
            {
                if (DictionaryExpression.ContainsKey(item))
                {
                    ResultText.Add(DictionaryExpression[item]);
                }
                else
                {
                    ResultText.Add(item);
                }
            }
            context.SourceText = string.Concat(ResultText);
        }
    }

上下文对象:

    public class Context
    {
        public string SourceText { get; set; }
        public string ResultText { get { return SourceText; } }
    }

实际使用:

        static void Main(string[] args)
        {

            while (true)
            {
                var ReadText = Console.ReadLine();

                Context context = new Context();
                context.SourceText = ReadText;

                List<BaseExpression> ExpressionList = new List<BaseExpression>();
                ExpressionList.Add(new WordExpression());
                ExpressionList.Add(new NumberExpression());

                foreach (var item in ExpressionList)
                {
                    item.Translate(context);
                }

                Console.WriteLine("输入字符:{0},翻译字符:{1}", ReadText, context.ResultText);

            }

        }

 

运行结果:

 

以上是关于解释器模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式 行为型模式 实例 -- 解释器模式实例:实现四则运算的计算器

《软件需求模式》精读阅读笔记一

软件设计原则都有哪些

工厂模式--实战详解

阅读笔记

七面向对象之单例设计模式