一、问题产生背景

有一句话“小明和小龙是好朋友”,我想分析其中谁是人,我想分析他们的关系等多种需求,那么我们应该如何处理,如果为每一个关系都进行判断?显然不合适,我们可以将二者的关系进行抽象处理,然后就是实现多种关系规则,最后由规则解释你输入的话。解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。

二、通常做法

AbstractExpression声明一个为抽象语法树中所有节点所共享的解释接口。

TerminalExpression表示终结符表达式,实现文法中终结符相关联的所有解释操作。

NonterminalExpression表示非终结符表达式,实现文法中所有非终结符的解释操作。

Context包含解释器外的一些全局信息。

Client构建语法树并调用解释器。

三、实例

1、构建一个抽象表达

namespace InterpreterPattern
{
public interface IExpress
{
bool Interpret(string context);
}
}

2、构建终结语法

namespace InterpreterPattern
{
public class TerminalExpress:IExpress
{
private string _data;
public TerminalExpress(string data)
{
_data = data;
} public bool Interpret(string context)
{
if (context.Contains(_data))
{
return true;
}
return false;
}
}
}

3、构建“与”语法

namespace InterpreterPattern
{
public class AndExpression : IExpress
{
private IExpress _expr1 = null;
private IExpress _expr2 = null; public AndExpression(IExpress expr1, IExpress expr2)
{
_expr1 = expr1;
_expr2 = expr2;
} public bool Interpret(string context)
{
return _expr1.Interpret(context) && _expr1.Interpret(context);
}
}
}

4、构建“或

namespace InterpreterPattern
{
public class OrExpression: IExpress
{
private IExpress _expr1 = null;
private IExpress _expr2 = null; public OrExpression(IExpress expr1, IExpress expr2)
{
_expr1 = expr1;
_expr2 = expr2;
} public bool Interpret(string context)
{
return _expr1.Interpret(context) || _expr1.Interpret(context);
}
}
}

5、构建解释器

namespace InterpreterPattern
{
public static class Translator
{
//规则:Robert 和 John 是男性
public static IExpress GetMaleExpression()
{
IExpress robert = new TerminalExpress("Robert");
IExpress john = new TerminalExpress("John");
return new OrExpression(robert, john);
} //规则:Julie 是一个已婚的女性
public static IExpress GetMarriedWomanExpression()
{
IExpress julie = new TerminalExpress("Julie");
IExpress married = new TerminalExpress("Married");
return new AndExpression(julie, married);
} }
}

6、客户端调用

namespace InterpreterPattern
{
class Program
{
static void Main(string[] args)
{
IExpress isMale = Translator.GetMaleExpression();
IExpress isMarriedWoman = Translator.GetMarriedWomanExpression(); Console.WriteLine("John is male? " + isMale.Interpret("John"));
Console.WriteLine("Julie is a married women? "+ isMarriedWoman.Interpret("Married Julie")); Console.ReadKey();
}
}
}

四、设计模式分析

优点: 1、可扩展性比较好,灵活。

2、增加了新的解释表达式的方式。

3、易于实现简单文法。

缺点: 1、可利用场景比较少。

2、对于复杂的文法比较难维护。

3、解释器模式会引起类膨胀。

4、解释器模式采用递归调用方法。

点击获取代码

设计模式のInterpreter Patern(解释器模式)----行为模式的更多相关文章

  1. 【GOF23设计模式】解释器模式 & 访问者模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_解释器模式.访问者模式.数学表达式动态解析库式 1.解释器模式Interpreter  2.访问者模式Visitor 

  2. [JAVA设计模式]第四部分:行为模式

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  3. Java设计模式(14)责任链模式(Chain of Responsibility模式)

    Chain of Responsibility定义:Chain of Responsibility(CoR) 是用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合, ...

  4. Java经典设计模式之十一种行为型模式(附实例和详解)

    Java经典设计模式共有21中,分为三大类:创建型模式(5种).结构型模式(7种)和行为型模式(11种). 本文主要讲行为型模式,创建型模式和结构型模式可以看博主的另外两篇文章:Java经典设计模式之 ...

  5. Java设计模式之十一种行为型模式(附实例和详解)

    Java经典设计模式共有21中,分为三大类:创建型模式(5种).结构型模式(7种)和行为型模式(11种). 本文主要讲行为型模式,创建型模式和结构型模式可以看博主的另外两篇文章:J设计模式之五大创建型 ...

  6. Java经典设计模式之十一种行为型模式

    转载: Java经典设计模式之十一种行为型模式 Java经典设计模式共有21中,分为三大类:创建型模式(5种).结构型模式(7种)和行为型模式(11种). 本文主要讲行为型模式,创建型模式和结构型模式 ...

  7. Java设计模式(三) 抽象工厂模式

    原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...

  8. Java设计模式(十二) 策略模式

    原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...

  9. Java设计模式(二) 工厂方法模式

    本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...

随机推荐

  1. Tomcat日志设定

    1    Tomcat 日志概述 Tomcat 日志信息分 为 两 类 : 一.是运行中的日志,它主要 记录 运行的一些信息,尤其是一些异常 错误 日志信息 .二.是 访问 日志信息,它 记录 的 访 ...

  2. SpringBoot 配置静态资源映射

    SpringBoot 配置静态资源映射 (嵌入式servlet容器)先决知识 request.getSession().getServletContext().getRealPath("/& ...

  3. Java基础IO流(四)序列化与反序列化

    对象的序列化与反序列化: 对象的序列化,就是将Object转换成byte序列,反之叫对象的反序列化. 序列化流(ObjectOutInputStream),是过滤流 -------writeObjec ...

  4. 兼容浏览器的div透明

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. 【机器学习基本理论】详解最大后验概率估计(MAP)的理解

    [机器学习基本理论]详解最大后验概率估计(MAP)的理解 https://blog.csdn.net/weixin_42137700/article/details/81628065 最大似然估计(M ...

  6. ios12怎么投屏电脑 苹果手机怎么投

    Ios12系统发布成功之后,是不是给我们带来更大的惊喜呢.我们只需要利用手机上的屏幕镜像就可以轻松将手机画面投屏至电脑上,那么ios12怎么投屏电脑?下面便是今天所要分享的手机投屏的方法. 使用工具: ...

  7. SD Consultant Year End Activities

    SD Consultant Year End Activities What are the year ending activities to be done for SAP SD?   S.No ...

  8. [转] vi/vim命令模式和编辑模式各种操作

    摘要:vi 编辑器是最常用的文档创建和编辑工具,初学者应该学会简单应用vi ,学会在vi 中做简单的修改.删除.插入.搜索及替换作业:如果您是新手,不妨看看本文,或许这篇文档能让您在最短的时间内学会v ...

  9. CSS之表格边框合并、兄弟标签外边距合并、父子标签的外边距合并

    本文内容: 表格边框合并 兄弟标签外边距合并 父子标签的外边距合并 首发日期:2018-05-01 表格边框合并: 发生情况: 当设置了cellpadding="0" cellsp ...

  10. JVM 之类加载

    一.概述 Java不同于C/C++这类传统的编译型语言,也不同于php这一类动态的脚本语言.可以说Java是一种半编译语言,我们所写的类会先被编译成.class文件,这个.class是一串二进制的字节 ...