Fork me on GitHub
极速理解设计模式系列:24.解释器模式(Interpreter Pattern)

五个角色:场景(Context)、抽象表达式(Component)、终结符表达式(TerminalExpression)、非终结符表达式(NonterminalExpression)、客户端(Client) 

        场景(Context):解释器的全局信息

        抽象表达式(Component):定义一个接口来解释操作

        终结符表达式(TerminalExpression):直接跳过步骤,不用解释语句

        非终结符表达式(NonterminalExpression):根据规则实现解释操作

        客户端(Client):调用解释器,对语句进行解释。

实现思路:建立语法树,然后用语法将表达式进行解析。

类图: 

 

应用场景:将十六进制值解释为十进制。

分析:如果以0X开头则将十六进制解释为十进制,否则直接输出的就是十进制不需要解释。

        下面我们在控制台程序去演示一下如何使用Interpreter Pattern:

        一、 场景(Context)

  //场景(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; }
}

        二、抽象表达式(Component)

    //抽象表达式类(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)

   //终结符表达式(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)

    //非终结符表达式(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)

    //客户端(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();
}
}

       如需源码请点击 InterpreterPattern.rar 下载。

作者:程兴亮 
出处:http://www.cnblogs.com/chengxingliang/ 
本文版权归作者和博客园共有,欢迎转载,未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

当前标签: 极速理解设计模式系列

 
程兴亮 2012-01-09 10:59 阅读:856 评论:1
 
程兴亮 2011-12-22 10:22 阅读:1182 评论:0
 
程兴亮 2011-12-19 12:02 阅读:1068 评论:1
 
程兴亮 2011-12-12 13:41 阅读:1255 评论:4
 
程兴亮 2011-11-29 10:56 阅读:1227 评论:0
 
程兴亮 2011-11-22 14:15 阅读:1148 评论:2
 
程兴亮 2011-10-31 11:17 阅读:3898 评论:16
 
程兴亮 2011-10-24 12:32 阅读:1422 评论:8
 
程兴亮 2011-10-18 10:51 阅读:1121 评论:2
 
程兴亮 2011-10-17 10:48 阅读:1261 评论:4
 
程兴亮 2011-10-12 10:31 阅读:1223 评论:3
 
程兴亮 2011-10-10 09:42 阅读:1202 评论:0
 
程兴亮 2011-09-29 11:10 阅读:1410 评论:6
 
程兴亮 2011-09-27 10:17 阅读:1697 评论:4
 
程兴亮 2011-09-26 10:35 阅读:1610 评论:2
 
程兴亮 2011-09-20 10:32 阅读:1562 评论:10
 
程兴亮 2011-09-15 10:23 阅读:1377 评论:4
 
程兴亮 2011-09-02 10:15 阅读:1376 评论:4
 
程兴亮 2011-08-30 10:36 阅读:1817 评论:2
 
程兴亮 2011-08-22 11:11 阅读:2192 评论:11
 
程兴亮 2011-07-14 09:59 阅读:3622 评论:15
posted on 2012-01-11 23:41  HackerVirus  阅读(197)  评论(0编辑  收藏  举报