设计模式のInterpreter Patern(解释器模式)----行为模式
一、问题产生背景
有一句话“小明和小龙是好朋友”,我想分析其中谁是人,我想分析他们的关系等多种需求,那么我们应该如何处理,如果为每一个关系都进行判断?显然不合适,我们可以将二者的关系进行抽象处理,然后就是实现多种关系规则,最后由规则解释你输入的话。解释器模式(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(解释器模式)----行为模式的更多相关文章
- 【GOF23设计模式】解释器模式 & 访问者模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_解释器模式.访问者模式.数学表达式动态解析库式 1.解释器模式Interpreter 2.访问者模式Visitor
- [JAVA设计模式]第四部分:行为模式
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- Java设计模式(14)责任链模式(Chain of Responsibility模式)
Chain of Responsibility定义:Chain of Responsibility(CoR) 是用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合, ...
- Java经典设计模式之十一种行为型模式(附实例和详解)
Java经典设计模式共有21中,分为三大类:创建型模式(5种).结构型模式(7种)和行为型模式(11种). 本文主要讲行为型模式,创建型模式和结构型模式可以看博主的另外两篇文章:Java经典设计模式之 ...
- Java设计模式之十一种行为型模式(附实例和详解)
Java经典设计模式共有21中,分为三大类:创建型模式(5种).结构型模式(7种)和行为型模式(11种). 本文主要讲行为型模式,创建型模式和结构型模式可以看博主的另外两篇文章:J设计模式之五大创建型 ...
- Java经典设计模式之十一种行为型模式
转载: Java经典设计模式之十一种行为型模式 Java经典设计模式共有21中,分为三大类:创建型模式(5种).结构型模式(7种)和行为型模式(11种). 本文主要讲行为型模式,创建型模式和结构型模式 ...
- Java设计模式(三) 抽象工厂模式
原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...
- Java设计模式(十二) 策略模式
原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...
- Java设计模式(二) 工厂方法模式
本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...
随机推荐
- 从零开始学安全(十四)●Windows Server 2012 R2 本地搭建FTP服务器
打开仪表盘添加角色和功能向导 下一步 等待安装完成 打开iis 新建站点 点击 选一个目录作为 ftp文件服务器的存储路径 后面就和iis 创建站点一样了 匿名就不需要密码 就可以访问基本需要特定的账 ...
- axios 用法简介(转载)
axios 来源:https://www.jianshu.com/p/df464b26ae58 一.安装 1. 利用npm安装npm install axios --save2. 利用bower安 ...
- spring_05装配bean
一.前言 <bean id="user1" scope="singleton" init-method="myInit" destro ...
- 如何清除浮动(float)所带来的影响
清除浮动(float) 1.定义和用法 在w3c中给了浮动这样的定义. "float 属性定义元素在哪个方向浮动.以往这个属性总应用于图像,使文本围绕在图像周围,不过在 CSS 中,任何元素 ...
- Html5页面内使用JSON动画的实现
有一天我们的UI设计师找到我说,要把页面中我自己用程序写的动画,换成他们给的json动画,原因是有的动画很复杂,自己写起来达不到他们的预期效果(写到这里我突然想到一个问题,这么复杂的动画为什么不使用g ...
- js求渐升数的第100位
我弟考了道数学竞赛题,问我能不能用代码算结果.. 题目是这样的 用 1.2.3.4.5 组合数字,然后排列大小,从小到大,求排在第100位的数值大小 function foo(chars) { ; i ...
- 2017-11-09 中文代码示例之Vuejs入门教程(一)
"中文编程"知乎专栏原链 为了检验中文命名在主流框架中的支持程度, 在vuejs官方入门教程第一部分的示例代码中尽量使用了中文命名. 所有演示都在本地测试通过, 源码在这里. 下面 ...
- WPF:Hyperlink如何绑定数据
<TextBlock> <Hyperlink> <Run Text="{Binding PCFolderPath, Mode=OneWay}"/> ...
- Appium+java 获取元素状态
元素的属性我们经常会用到,当定位到某个元素后,有时会需要用到这个元素的text值.className.resource-id.checked等. 一般标准的属性我们都可以通过get_attribut ...
- LeetCode题解之Squares of a Sorted Array
1.题目描述 2.问题分析 使用过两个计数器. 3.代码 class Solution { public: vector<int> sortedSquares(vector<int& ...