zoukankan      html  css  js  c++  java
  • Interpreter+解释器模式(行为型模式)

     public abstract class Expression
        {
            protected Dictionary<string, int> table = new Dictionary<string, int>( 9 );
            public Expression()
            {
                table.Add( "", 1 );
                table.Add( "", 2 );
                table.Add( "", 3 );
                table.Add( "", 4 );
                table.Add( "", 5 );
                table.Add( "", 6 );
                table.Add( "", 7 );
                table.Add( "", 8 );
                table.Add( "", 9 );
            }
            public virtual void Interpret( Context context )
            {
                if( context.Statement.Length == 0 )
                {
                    return;
                }
                foreach( string key in table.Keys )
                {
                    int value = table[ key ];
                    if( context.Statement.EndsWith( key + GetPostfix() ) )
                    {
                        context.Data += value * this.Mutiplier();
                        context.Statement = context.Statement.Substring( 0, context.Statement.Length - this.GetLenght() );
                    }
                    if( context.Statement.EndsWith( "" ) )
                    {
                        context.Statement = context.Statement.Substring( 0, context.Statement.Length - 1 );
                    }
                }
            }
    
            public virtual int GetLenght()
            {
                return this.GetPostfix().Length + 1;
            }
    
            public abstract int Mutiplier();
            public abstract string GetPostfix();
        }
      public class GeExpression:Expression
        {
            public override int Mutiplier()
            {
                return 1;
            }
    
            public override string GetPostfix()
            {
                return "";
            }
    
            public override int GetLenght()
            {
                return 1;
            }
        }
     public class ShiExpression:Expression
        {
            public override int Mutiplier()
            {
                return 10;
            }
    
            public override string GetPostfix()
            {
                return "";
            }
        }
     public class BaiExpression:Expression
        {
            public override int Mutiplier()
            {
                return 100;
            }
    
            public override string GetPostfix()
            {
                return "";
            }
        }
      public class QianExpression:Expression
        {
            public override int Mutiplier()
            {
                return 1000;
            }
    
            public override string GetPostfix()
            {
                return "";
            }
        }
      public class WanExpression:Expression
        {
            public override int Mutiplier()
            {
                return 10000;
            }
    
            public override string GetPostfix()
            {
                return "";
            }
            public override void Interpret( Context context )
            {
                if( context.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( string key in table.Keys )
                {
                    if( context.Statement.EndsWith( this.GetPostfix() ) )
                    {
                        int temp = context.Data;
                        context.Data = 0;
    
                        context.Statement = context.Statement.Substring( 0, context.Statement.Length - 1 );
    
                        foreach( Expression exp in tree )
                        {
                            exp.Interpret( context );
                        }
                        context.Data = temp + this.Mutiplier() * context.Data;
                    }
                }
            }
    
        }
      static void Main( string[] args )
            {
                string roman = "六千四百五十二";
                Context context = new Context( roman );
    
                ArrayList tree = new ArrayList();
                tree.Add( new GeExpression() );
                tree.Add( new ShiExpression() );
                tree.Add( new BaiExpression() );
                tree.Add( new QianExpression() );
                tree.Add( new WanExpression() );
    
                foreach( Expression exp in tree )
                {
                    exp.Interpret( context );                
                }
    
                Console.WriteLine( "{0} = {1}", roman, context.Data );
            }
     public class Context
        {
            public Context( string roman )
            {
                this.Statement = roman;
            }
            public int Data;
            public string Statement;
        }

     有点难,只是不断递归循环处理,用一个解释器不断的去处理

  • 相关阅读:
    angularjs 学习笔记(一)
    iconfont项目成员添加不进去的问题
    服务器webapi集成极光推送学习笔记
    winform closing事件注册
    asp.net core webapi 似乎未安装在 IIS 中承载 .NET Core 项目所需的 AspNetCoreModule。请尝试修复 Visual Studio 以纠正该问题。
    css 行内元素设置宽高
    透过浏览器看HTTP缓存[转载]
    矢量字体图标
    HTML5新特性之WebRTC[转]
    一个前后端分离方案[转载]
  • 原文地址:https://www.cnblogs.com/wangchuang/p/3013007.html
Copyright © 2011-2022 走看看