2012-01-09 10:59:00
![](https://i-blog.csdnimg.cn/blog_migrate/19bd8680dbed045c2bfa09d2583553b8.png)
- //场景(Context)
- class Context
- {
- public Context(string input)
- {
- this.Input = input;
- }
- /// <summary>
- /// 输入参数
- /// </summary>
- public string Input { get; set; }
- /// <summary>
- /// 输出参数
- /// </summary>
- public int Output { get; set; }
- /// <summary>
- /// 是否是十六进制 如果是转为十进制,否则不转
- /// </summary>
- public bool Status { get; set; }
- }
- //抽象表达式类(AbstractExpression)
- abstract class Expression
- {
- public virtual void Interpret(Context context)
- {
- if (context.Input.Length == 0)
- return;
- int multiresult = Multiplier(context);
- if (multiresult == 0)
- return;
- if(context.Input.StartsWith("F"))
- {
- context.Output += (15 * multiresult);
- context.Input=context.Input.Substring(1);
- }
- else if (context.Input.StartsWith("F"))
- {
- context.Output += (15 * multiresult);
- context.Input = context.Input.Substring(1);
- }
- else if (context.Input.StartsWith("E"))
- {
- context.Output += (14 * multiresult);
- context.Input = context.Input.Substring(1);
- }
- else if (context.Input.StartsWith("D"))
- {
- context.Output += (13 * multiresult);
- context.Input = context.Input.Substring(1);
- }
- else if (context.Input.StartsWith("C"))
- {
- context.Output += (12 * multiresult);
- context.Input = context.Input.Substring(1);
- }
- else if (context.Input.StartsWith("B"))
- {
- context.Output += (11 * multiresult);
- context.Input = context.Input.Substring(1);
- }
- else if (context.Input.StartsWith("A"))
- {
- context.Output += (10 * multiresult);
- context.Input = context.Input.Substring(1);
- }
- else
- {
- context.Output += (int.Parse(context.Input.Substring(0, 1)) * multiresult);
- context.Input = context.Input.Substring(1);
- }
- }
- //该位置需要做的乘法值
- public abstract int Multiplier(Context context);
- }
- //终结符表达式(TerminalExpression)
- class NumterminalExp : Expression
- {
- public override void Interpret(Context context)
- {
- if (context.Input.StartsWith("0X"))
- {
- context.Input = context.Input.Substring(2);
- context.Status = true;
- }
- else
- {
- context.Output = int.Parse(context.Input);
- context.Status = false;
- return;
- }
- }
- public override int Multiplier(Context context)
- {
- return 1;
- }
- }
- //非终结符表达式(NonterminalExpression) 千位计算
- class ThousandExp : Expression
- {
- public override int Multiplier(Context context)
- {
- if (context.Input.Length == 4&&context.Status)
- return 16 * 16 * 16;
- else
- return 0;
- }
- }
- //非终结符表达式(NonterminalExpression) 百位计算
- class HundredExp : Expression
- {
- public override int Multiplier(Context context)
- {
- if (context.Input.Length == 3 && context.Status)
- return 16 * 16;
- else
- return 0;
- }
- }
- //非终结符表达式(NonterminalExpression) 十位计算
- class TenExp : Expression
- {
- public override int Multiplier(Context context)
- {
- if (context.Input.Length == 2 && context.Status)
- return 16;
- else
- return 0;
- }
- }
- //非终结符表达式(NonterminalExpression) 个位计算
- class OneExp : Expression
- {
- public override int Multiplier(Context context)
- {
- if (context.Input.Length == 1 && context.Status)
- return 1;
- else
- return 0;
- }
- }
- //客户端(Client)
- class Program
- {
- static void Main(string[] args)
- {
- string input = "0XA321";
- Context context = new Context(input.ToUpper());
- List<Expression> expTree = new List<Expression>();
- expTree.Add(new NumterminalExp());
- expTree.Add(new ThousandExp());
- expTree.Add(new HundredExp());
- expTree.Add(new TenExp());
- expTree.Add(new OneExp());
- foreach (Expression exp in expTree)
- {
- exp.Interpret(context);
- }
- Console.WriteLine("十六进制数{0}转换为十进制数{1}", input, context.Output);
- Console.ReadLine();
- }
- }