设计模式の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 ...
随机推荐
- [PHP]PHP rpc框架hprose测试
建立composer.json { "name": "hprose/examples", "description": "exam ...
- [日常] HTTP的缓存
web缓存: 1.可以自动保存常见文档副本的HTTP设备,当web请求抵达缓存时,如果存在缓存副本,就直接从本地存储设备返回,而不是去源服务器获取 2.缓存命中和未命中 3.HTTP再验证,检测服务器 ...
- Netty实战四之传输
流经网络的数据总是具有相同的类型:字节(网络传输——一个帮助我们抽象底层数据传输机制的概念) Netty为它所有的传输实现提供了一个通用的API,即我们可以将时间花在其他更有成效的事情上. 我们将通过 ...
- JavaSE-基础语法(三)-面向对象
面向对象 8.类9.对象10.封装11.继承12.多态13.构造器14.super15.this16.接口17.抽象类18.权限修饰符19.内部类
- Spring Cloud 研发框架demo
第一步:准备工作 1.下载并集成公司自定义maven maven包见QQ群文件 2.克隆Git源码到本地eclipse: xx 3.构建项目 一键初始化parent:run as maven inst ...
- Java马士兵高并发编程视频学习笔记(二)
1.ReentrantLock的简单使用 Reentrant n.再进入 ReentrantLock 一个可重入互斥Lock具有与使用synchronized方法和语句访问的隐式监视锁相同的基本行为和 ...
- Java并发编程学习:volatile关键字解析
转载:https://www.cnblogs.com/dolphin0520/p/3920373.html 写的非常棒,好东西要分享一下 Java并发编程:volatile关键字解析 volatile ...
- Could not open input file: artisan 【Laravel初体验】
1,情景描述:在命令行窗口写入php artisan make:model Models\MenuModel用于创建模型时,出现此错误(Could not open input file: artis ...
- java框架之spring
一.HelloWorld程序 导入四个核心包(core.beans.expression.context)和一个logging的包: 写一个类并在 xml 中配置相应的bean(两个重要属性 id 和 ...
- iOS ----------如何修改mac的host文件
第一步:前往文件夹 或者 按快捷键组合 Shift+Command+G 三个组合按键. 第二步:前往/private/etc/ 找到Hosts 文件 复制到桌面 修改 然后 保 ...