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;
        }

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

  • 相关阅读:
    网易云服务器使用https
    网站搬家后firefox,chrome提示内容编码错误,360浏览器提示500错误
    腾讯云centos服务器配置
    微擎二次开发相关
    mysql 分组查询最新的/最高的一条记录
    .htaccess ci放在子目录时规则
    小程序 html解析
    源于一道文字游戏的题目
    C# 获取系统时间及时间格式
    操作bin目录下的文件
  • 原文地址:https://www.cnblogs.com/wangchuang/p/3013007.html
Copyright © 2011-2022 走看看