设计模式16——行为型模式之解释器模式
2014-02-19 21:37
316 查看
定义:解释器模式(Interpreter Pattern)给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
类型:类行为型模式
概述:
正如GoF所介绍的,解释器模式的应用场合比较窄。解释器模式在《Head
First Design Pagtterns》中也被列为非常用模式。解释器模式虽然说更多应用在某种语言上,但是解释器的原理还是可以应用在其他场合的。
解释器模式与组合模式有很大的相似性。正如GoF所言,在最宽泛的概念下,几乎每个使用复合模式的系统也都使用了解释器模式。解释器模式与组合模式的不同主要体现在,解释器模式中的几个解释器类都有相同的接口,而组合模式则是直接聚合几个没有关联的类。
解释器模式虽说多用于某种解释语言上,但是其思想还是可以应用在其它方面的。解释器模式作为类行为模式,其主要是通过将一组平行操作的行为抽象出来作为独立的类存在。以达到降低类调用的耦合以及更方便地添加新的解释操作。这里举一个比较简单示例,有一段文字内容,需要用几个解释器来识别其中的地名,人名。
类图:
参与者:
Client,构建Context,以及完成解释器的调用操作。
Context,需要被解释的文件内容。
Expression,抽象类,提供接口。
NameExpression、AddressExpression,实现接口的具有解释操作。
示例代码:
适用性:
该文法简单对于复杂的文法,文法的类层次变得庞大而无法管理。
效率不是一个关键问题最高效的解释器通常不是通过直接解释语法分析树实现的,而是首先将它们转换成另一种形式。
优缺点:
优点,能够灵活添加新的操作类。
缺点,使用范围过于狭窄。
参考资料:
《设计模式——可复用面向对象软件基础》
《大话设计模式》
《Head First设计模式》
类型:类行为型模式
概述:
正如GoF所介绍的,解释器模式的应用场合比较窄。解释器模式在《Head
First Design Pagtterns》中也被列为非常用模式。解释器模式虽然说更多应用在某种语言上,但是解释器的原理还是可以应用在其他场合的。
解释器模式与组合模式有很大的相似性。正如GoF所言,在最宽泛的概念下,几乎每个使用复合模式的系统也都使用了解释器模式。解释器模式与组合模式的不同主要体现在,解释器模式中的几个解释器类都有相同的接口,而组合模式则是直接聚合几个没有关联的类。
解释器模式虽说多用于某种解释语言上,但是其思想还是可以应用在其它方面的。解释器模式作为类行为模式,其主要是通过将一组平行操作的行为抽象出来作为独立的类存在。以达到降低类调用的耦合以及更方便地添加新的解释操作。这里举一个比较简单示例,有一段文字内容,需要用几个解释器来识别其中的地名,人名。
类图:
参与者:
Client,构建Context,以及完成解释器的调用操作。
Context,需要被解释的文件内容。
Expression,抽象类,提供接口。
NameExpression、AddressExpression,实现接口的具有解释操作。
示例代码:
using System; using System.Collections.Generic; using System.Text; namespace Interpreter { class Context { private string input; public string Input { get { return input; } set { input = value; } } private string output; public string Output { get { return output; } set { output = value; } } } abstract class AbstractExpression { public abstract void Interpret(Context context); } class NameExpression : AbstractExpression { public override void Interpret(Context context) { Console.WriteLine("名字解释器"); } } class AddressExpression : AbstractExpression { public override void Interpret(Context context) { Console.WriteLine("地址解释器"); } } class Program { static void Main(string[] args) { Context context = new Context(); IList<AbstractExpression> list = new List<AbstractExpression>(); list.Add(new NameExpression()); list.Add(new AddressExpression()); foreach (AbstractExpression exp in list) { exp.Interpret(context); } } } }
适用性:
该文法简单对于复杂的文法,文法的类层次变得庞大而无法管理。
效率不是一个关键问题最高效的解释器通常不是通过直接解释语法分析树实现的,而是首先将它们转换成另一种形式。
优缺点:
优点,能够灵活添加新的操作类。
缺点,使用范围过于狭窄。
参考资料:
《设计模式——可复用面向对象软件基础》
《大话设计模式》
《Head First设计模式》
相关文章推荐
- 邻接链表的建立
- 短信
- 前端程序员容易忽视的一些基础知识
- [转载]cocos2d-触摸分发原理
- 邻接链表的建立
- 题目1001:A+B for Matrices
- 一起学习水晶报表之【如何实现Web网页显示水晶报表和绑定数据】(课程1)
- 制作动画效果:《CSS3 Animation》
- 编写脚本增强windbg堆栈、内存窗口【有码有真相啊】
- [转]为什么连接同一台交换机的不同网段的PC无法进行通信?
- NAS与SAN区别
- 制作动画效果:《CSS3 Animation》
- s3cmd使用问题--mv时提示超时
- ios之UITableView设置横向
- e-learning
- We have detected that MySQL products under the Commercial license are installed. In order to proceed with this GPL installation these Commercial
- Try、finally语句块内 有 return 的注意问题
- I/O负载均衡策略之一 条带化
- POJ练习深搜
- Chapter 1 A Quick Tour