Exemple #1
0
        public override void Interpreter(Contetxt contetxt)
        {
            if (contetxt.Statement.Length == 0)
            {
                return;
            }
            ArrayList tree = new ArrayList();

            tree.Add(new GeExpression());
            tree.Add(new ShiExpression());
            tree.Add(new BaiExpression());
            tree.Add(new QianExpression());

            foreach (var key in MapperDict.Keys)
            {
                if (contetxt.Statement.EndsWith(this.GetPostfix()))
                {
                    int temp = contetxt.Data;
                    contetxt.Data = 0;

                    contetxt.Statement = contetxt.Statement.Substring(0, contetxt.Statement.Length - 1);

                    //迭代解释‘万’之前的expression
                    foreach (ExpressionBase exp in tree)
                    {
                        exp.Interpreter(contetxt);
                    }

                    contetxt.Data = temp + this.Mutiplier * contetxt.Data;
                }
            }
        }
        //


        static void Main(string[] args)
        {
            //意图(Intent):给定一个语言,定义它的文法的一种表示,并定义一种解释器,这个解释器使用该表示来解释语言中的句子。
            //Interpreter模式的应用场合是Interpreter模式应用中的难点,只有满足“业务规则频繁变化,且类似的模式不断重复出现,并且容易抽象为语法规则的问题”才适合使用Interpreter模式。
            //正则表达式就是一个典型的解释器。ASP.NET中,把aspx文件转化为dll时,会对html语言进行处理,这个处理过程也包含了解释器的模式在里面。Interpreter模式其实有Composite模式的影子,但它们解决的问题是不一样的。

            //Demo:将汉字转化为数字

            //Solution 1:  不用设计模式的解决办法
            string    statement = "五万八千六百四十三";
            ArrayList expTree   = new ArrayList();
            Contetxt  contetxt  = new Contetxt(statement);

            expTree.Add(new GeExpression());
            expTree.Add(new ShiExpression());
            expTree.Add(new BaiExpression());
            expTree.Add(new QianExpression());
            expTree.Add(new WanExpression());

            foreach (ExpressionBase exp in expTree)
            {
                exp.Interpreter(contetxt);
            }
            Console.WriteLine("{0} = {1}", statement, contetxt.Data);
            Console.Read();
        }
        public virtual void Interpreter(Contetxt contetxt)
        {
            foreach (var key in MapperDict.Keys)
            {
                int value = MapperDict[key];

                if (contetxt.Statement.EndsWith(key + GetPostfix()))
                {
                    contetxt.Data     += value * this.Mutiplier;
                    contetxt.Statement = contetxt.Statement.Substring(0, contetxt.Statement.Length - 2);
                }

                if (contetxt.Statement.EndsWith("零"))
                {
                    contetxt.Statement = contetxt.Statement.Substring(0, contetxt.Statement.Length - 1);
                }
            }
        }