极速理解设计模式系列:23.解释器模式(Interpreter Pattern)-阿里云开发者社区

开发者社区> 橘子红了呐> 正文

极速理解设计模式系列:23.解释器模式(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/archive/2012/01/09/2310948.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
带你读《计算机组成与体系结构:性能设计(英文版·原书第10版)》之二:Performance Issues
本书以Intel x86体系结构和ARM两个处理器系列为例,将当代计算机系统性能设计问题与计算机组成的基本概念和原理紧密联系起来,介绍了当代计算机体系结构的主流技术和最新技术。本书作者曾13次获a得美国教材和学术专著作者协会颁发的年度最佳计算机科学教材奖。目前,他是一名独立顾问,为众多计算机和网络制造商、软件开发公司以及政府前沿研究机构提供服务。
567 0
电商ERP系统——商品SKU与库存设计
总体思路 1.商品关联商品类别,商品类别关联多个商品属性,其中指定某几个商品属性为SKU关键字段。例如,服装类别的颜色、尺码属性。 2.多个SKU商品属性值组合生成唯一的商品SKUID。
4138 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
4503 0
设计模式(十六) 解释器模式
解释器模式是一种行为型模式,它的主要作用是用一种方式来实现对表达式或文法的处理。我们可以使用解释器模式处理语言的解析,在设计计算机语言的时候解释器模式很有用处。
627 0
阿里云服务器远程登录用户名和密码的查询方法
阿里云服务器远程连接登录用户名和密码在哪查看?阿里云服务器默认密码是什么?云服务器系统不同默认用户名不同
444 0
RPA干货丨详解RPA的设计与构建
德勤在一份有关RPA的研究报告中曾提到,一家收入在200亿美元且拥有5万名员工的财富1000强公司,如果其20%的工作能够用RPA实现流程自动化,每年将会为公司带来超过3000万美元的利润。实施RPA已成为一项新潮流。
2803 0
3404
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载