- 浏览: 328730 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (262)
- Java (20)
- 设计模式 (16)
- Oracle (13)
- Struts (1)
- 问题解决 (9)
- ibatis (2)
- Maven (5)
- Git (2)
- 实现原理 (6)
- 敏捷开发 (22)
- Spring (4)
- 算法 (8)
- MySQL (2)
- Java工具箱 (17)
- jQuery (1)
- 英语学习 (8)
- 杂谈 (15)
- 多线程 (15)
- Java解惑 (7)
- Linux (1)
- 重构36计 (6)
- 网络 (4)
- PHP (1)
- Socket (6)
- 面试 (1)
- JVM (14)
- 历史与故事 (5)
- 报表 (4)
- CMS (3)
- Windows (1)
- nginx (5)
- 架构设计 (7)
- RubyOnRails (2)
- Hadoop (8)
- Go (7)
- JS (1)
- Web (1)
- 项目实例 (5)
- ubuntu (4)
最新评论
-
jacking124:
按照你这个配置以后提示这个异常?Exception occur ...
Go语言学习:开发环境搭建及Hello World -
焦志广:
有请看http://jiaozhiguang-126-com. ...
Hadoop白皮书(1):分布式文件系统HDFS简介 -
w156445045:
Hadoop 有没windows环境下的配置呢,
谢谢。非常感 ...
Hadoop白皮书(1):分布式文件系统HDFS简介 -
xiangxm:
学习了。
Java 解惑知多少六 -
焦志广:
xhh_lite 写道怎么少了一个类?恩?不少啊,少那个类啊; ...
易学设计模式四 命令模式(Commond)
解释器模式是类的行为模式。给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。
结构
(1)抽象表达式(Expression)角色:声明一个所有的具体表达式角色都需要实现的抽象接口。这个接口主要是一个interpret()方法,称做解释操作。
(2)终结符表达式(Terminal Expression)角色:实现了抽象表达式角色所要求的接口,主要是一个interpret()方法;文法中的每一个终结符都有一个具体终结表达式与之相对应。比如有一个简单的公式R=R1+R2,在里面R1和R2就是终结符,对应的解析R1和R2的解释器就是终结符表达式。
(3)非终结符表达式(Nonterminal Expression)角色:文法中的每一条规则都需要一个具体的非终结符表达式,非终结符表达式一般是文法中的运算符或者其他关键字,比如公式R=R1+R2中,“+"就是非终结符,解析“+”的解释器就是一个非终结符表达式。
(4)环境(Context)角色:这个角色的任务一般是用来存放文法中各个终结符所对应的具体值,比如R=R1+R2,我们给R1赋值100,给R2赋值200。这些信息需要存放到环境角色中,很多情况下我们使用Map来充当环境角色就足够了。
为了说明解释器模式的实现办法,这里给出一个最简单的文法和对应的解释器模式的实现,这就是模拟Java语言中对布尔表达式进行操作和求值。
在这个语言中终结符是布尔变量,也就是常量true和false。非终结符表达式包含运算符and,or和not等布尔表达式。这个简单的文法如下:
Expression ::= Constant | Variable | Or | And | Not
And ::= Expression 'AND' Expression
Or ::= Expression 'OR' Expression
Not ::= 'NOT' Expression
Variable ::= 任何标识符
Constant ::= 'true' | 'false'
解释器模式的结构图如下所示:
输出结果:
c=true
x=false
y=true
((true AND x) OR (y AND (Not x)))=true
参考:http://blog.csdn.net/m13666368773/article/details/7712110
结构
(1)抽象表达式(Expression)角色:声明一个所有的具体表达式角色都需要实现的抽象接口。这个接口主要是一个interpret()方法,称做解释操作。
(2)终结符表达式(Terminal Expression)角色:实现了抽象表达式角色所要求的接口,主要是一个interpret()方法;文法中的每一个终结符都有一个具体终结表达式与之相对应。比如有一个简单的公式R=R1+R2,在里面R1和R2就是终结符,对应的解析R1和R2的解释器就是终结符表达式。
(3)非终结符表达式(Nonterminal Expression)角色:文法中的每一条规则都需要一个具体的非终结符表达式,非终结符表达式一般是文法中的运算符或者其他关键字,比如公式R=R1+R2中,“+"就是非终结符,解析“+”的解释器就是一个非终结符表达式。
(4)环境(Context)角色:这个角色的任务一般是用来存放文法中各个终结符所对应的具体值,比如R=R1+R2,我们给R1赋值100,给R2赋值200。这些信息需要存放到环境角色中,很多情况下我们使用Map来充当环境角色就足够了。
为了说明解释器模式的实现办法,这里给出一个最简单的文法和对应的解释器模式的实现,这就是模拟Java语言中对布尔表达式进行操作和求值。
在这个语言中终结符是布尔变量,也就是常量true和false。非终结符表达式包含运算符and,or和not等布尔表达式。这个简单的文法如下:
Expression ::= Constant | Variable | Or | And | Not
And ::= Expression 'AND' Expression
Or ::= Expression 'OR' Expression
Not ::= 'NOT' Expression
Variable ::= 任何标识符
Constant ::= 'true' | 'false'
解释器模式的结构图如下所示:
package com.jiaozg.patterns.interpreter; public abstract class Expression { public abstract boolean interpret(Context ctx); public abstract boolean equals(Object obj); public abstract int hashCode(); public abstract String toString(); }
package com.jiaozg.patterns.interpreter; import java.util.HashMap; import java.util.Map; public class Context { private Map<Variable, Boolean> map = new HashMap<Variable, Boolean>(); public void assign(Variable var, boolean value) { map.put(var, Boolean.valueOf(value)); } public boolean lookup(Variable var) { Boolean value = map.get(var); if(value == null) { throw new IllegalArgumentException(); } return value.booleanValue(); } }
package com.jiaozg.patterns.interpreter; //一个Variable对象代表一个有名变量 public class Variable extends Expression { private String name; public Variable(String name) { this.name = name; } @Override public boolean equals(Object obj) { if(obj != null && (obj instanceof Variable)) { return this.name.equals(((Variable)obj).name); } return false; } @Override public int hashCode() { return this.toString().hashCode(); } @Override public boolean interpret(Context ctx) { return ctx.lookup(this); } @Override public String toString() { return name; } }
package com.jiaozg.patterns.interpreter; public class And extends Expression { private Expression left, right; public And(Expression left, Expression right) { this.left = left; this.right = right; } @Override public boolean equals(Object obj) { if(obj != null && (obj instanceof And)) { return left.equals(((And)obj).left) && right.equals(((And)obj).right); } return false; } @Override public int hashCode() { return this.toString().hashCode(); } @Override public boolean interpret(Context ctx) { return left.interpret(ctx) && right.interpret(ctx); } @Override public String toString() { return "(" + left.toString() + " AND " + right.toString() + ")"; } }
package com.jiaozg.patterns.interpreter; public class Or extends Expression { private Expression left, right; public Or(Expression left, Expression right) { this.left = left; this.right = right; } @Override public boolean equals(Object obj) { if(obj != null && (obj instanceof Or)) { return left.equals(((Or)obj).left) && right.equals(((Or)obj).right); } return false; } @Override public int hashCode() { return this.toString().hashCode(); } @Override public boolean interpret(Context ctx) { return left.interpret(ctx) || right.interpret(ctx); } @Override public String toString() { return "(" + left.toString() + " OR " + right.toString() + ")"; } }
package com.jiaozg.patterns.interpreter; public class Not extends Expression { private Expression exp; public Not(Expression exp) { this.exp = exp; } @Override public boolean equals(Object obj) { if(obj != null && (obj instanceof Not)) { return exp.equals(((Not)obj).exp); } return false; } @Override public int hashCode() { return this.toString().hashCode(); } @Override public boolean interpret(Context ctx) { return !exp.interpret(ctx); } @Override public String toString() { return "(Not " + exp.toString() + ")"; } }
package com.jiaozg.patterns.interpreter; //一个Constant对象代表一个布尔常量 public class Constant extends Expression { private boolean value; public Constant(boolean value) { this.value = value; } @Override public boolean equals(Object obj) { if(obj != null && (obj instanceof Constant)) { return this.value == ((Constant)obj).value; } return false; } @Override public int hashCode() { return this.toString().hashCode(); } @Override public boolean interpret(Context ctx) { return value; } @Override public String toString() { return Boolean.valueOf(value).toString(); } }
package com.jiaozg.patterns.interpreter; public class Client { public static void main(String[] args) { Context ctx = new Context(); Variable x = new Variable("x"); Variable y = new Variable("y"); Constant c = new Constant(true); ctx.assign(x, false); ctx.assign(y, true); Expression exp = new Or(new And(c, x),new And(y, new Not(x))); System.out.println("c=" + c.interpret(ctx)); System.out.println("x=" + x.interpret(ctx)); System.out.println("y=" + y.interpret(ctx)); System.out.println(exp.toString() + "=" + exp.interpret(ctx)); } }
输出结果:
c=true
x=false
y=true
((true AND x) OR (y AND (Not x)))=true
参考:http://blog.csdn.net/m13666368773/article/details/7712110
发表评论
-
Java 23种设计模式的有趣见解
2012-10-19 09:52 822创建型模式 1、FACTORY—追MM少不了请吃饭了,麦当 ... -
易学设计模式14 调停者模式(Mediator)
2012-09-13 14:01 1055调停者模式是对象的行为模式。调停者模式包装了一系列对象相互作用 ... -
易学设计模式13 状态模式(State)
2012-09-08 10:23 897状态模式(State Pattern)是设计模式的一种,属于行 ... -
易学设计模式11 观察者(Observer)
2012-09-06 13:36 972Observer模式是行为模式之一,它的作用是当一个对象的状态 ... -
易学设计模式十 单例序列键生成器
2012-09-04 21:40 848数据库有很多种,例如Oracle,DB2,Sybase,MyS ... -
易学设计模式九 单例模式(Singleton)
2012-09-03 21:41 834单例模式确保某一个类只有一个实例,并且自行实例化向整个系统提供 ... -
易学设计模式八 工厂方法(Factory Method)
2012-09-03 20:57 903工厂方法模式的用意是定义一个创建产品对象的工厂,将实际的创建工 ... -
易学设计模式七 简单工厂(Simple Factory)
2012-09-02 19:45 853简单工厂模式是类的创建模式,又叫做静态工厂方法(Static ... -
易学设计模式六 代理模式(Proxy)
2012-08-30 23:16 806代理模式(Proxy)为另一个对象提供一个替身或占位符以控制对 ... -
易学设计模式五 建造模式(Builder)
2012-08-30 21:34 807遇到多个构造器参数(Constructor Parameter ... -
易学设计模式四 命令模式(Commond)
2012-08-28 16:43 2044命令模式定义 将一个请求封装为一个对象,从而使 ... -
易学设计模式三 装饰模式(Decorator)
2012-08-26 22:31 1166装饰者模式 Decorator模式(别名Wrapper):动态 ... -
易学设计模式二 组合模式(Composite)
2012-08-21 16:02 1083组合模式 将对象组合成树形结构以表示"部分-整体& ... -
易学设计模式一 模板 方法(Template Method)
2012-08-19 22:16 746模版方法:抽象类实现部分逻辑,声明一些抽象方法迫使子类实现剩余 ... -
图说设计模式 (一)Strategy
2012-07-27 11:52 1153很久很久以前, 野鸭(MallardDuck)和 红头鸭(Re ...
相关推荐
**解释器模式(Interpreter)**是一种行为设计模式,它允许我们定义一种语言并为其创建一个解释器。在软件工程中,这种模式常用于处理简单的语言或表达式,例如配置文件、计算公式或者简单的脚本语言。通过使用解释...
**设计模式之解释器模式(Interpreter Pattern)** 解释器模式是一种行为设计模式,它提供了一种方式来表示语言的语法,并实现一个解释器用于解析这种语法的语句。这种模式通常用于小型、特定领域的语言(DSL)实现,...
解释器模式(Interpreter Pattern)是一种行为型设计模式,用于为特定语言的句法定义一个解释器。它通过定义一个语言的文法表示以及解释器的实现来解析和执行表达式。这种模式通常用于设计语言、脚本或规则引擎。 ...
3. **行为型模式**:行为型模式处理对象间的行为分配,例如责任链模式(Chain of Responsibility)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、中介者模式(Mediator)、备忘录模式...
C#面向对象设计模式 (行为型模式) Interpreter 解释器模式 视频讲座下载
在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不... 这是第16节:行为型模式Interpreter解释器模式
Interpreter(解释器)模式是一种行为设计模式,它提供了一种方式来表示一种语言的文法,并创建一个解释器来解释语言中的句子。这种模式主要用于解析简单的语言或表达式,例如计算表达式、配置文件等。在计算机科学...
解释器模式是一种行为设计模式,它提供了一种方式来表示语言的语法,并允许你使用该表示来解释语言中的句子。在C#中,解释器模式常用于构建自定义的编程语言或者解析特定格式的数据,例如配置文件、表达式计算等。 ...
解释器模式是一种行为设计模式,它允许我们定义一个语言的语法,并提供一种方式来解析该语言的表达式。在C#中,解释器模式通常用于处理简单的语言结构或执行基于特定规则的运算。这种模式的核心在于创建一个抽象语法...
解释器模式(Interpreter Pattern)是一种行为型设计模式,它用于定义一个语言的文法,并解析语言中的表达式。具体来说,解释器模式通过定义一个解释器来解释语言中的表达式,从而实现对语言的解析和执行。 在解释...
从提供的文件信息中,我们可以推断该课件《C++设计模式课件25_Interpreter.pdf》是关于C++语言实现设计模式中的解释器模式(Interpreter Pattern)的一部分教学资料。文件中出现的网站***和网易云课堂是指两个在线...
☆ 资料说明:☆ 《易学 设计模式》 郭志学 编著 随书源代码 ☆ 章节清单:☆ 第01章 欲速则不达:了解设计模式 ...第26章 望文生义:解释器模式 (Interpreter) 第27章 无招胜有招:如何在设计中应用设计模式
解释器模式是一种行为设计模式,它定义了一种语言和该语言的解释器,使得可以使用该语言来表达一些特定的操作。该模式适用于需要解释一些特定语言的场景,例如编译器、表达式计算器等。 在 Java 中,可以使用抽象...
本文实例讲述了PHP设计模式之解释器(Interpreter)模式。分享给大家供大家参考,具体如下: 解释器模式,它是什么呢? 意思就是,给定一个语言, 定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来...
解释器模式(Interpreter Pattern)是设计模式中的一种行为模式,主要用于解析特定语言或表达式。在Android开发中,尽管不常见,但当需要自定义简单的语言或者表达式解释执行时,解释器模式就显得尤为重要。 一、...
解释器模式属于软件设计模式的一种,它在面向对象编程中提供了处理特定类型语言的语法表示方法。在PHP中实现解释器模式,可以通过定义一个表达式接口以及一系列具体的表达式实现类来解析不同的表达式,而解释器类则...
**设计模式 - 解释器模式** 解释器模式是一种行为设计模式,它允许我们定义一个语言的文法,并创建一个解释器来解析该语言中的句子。这种模式常用于编写简单的语言或表达式解释器,比如配置文件、脚本语言或者...
解释器(Interpreter)模式的定义:给分析对象定义一个语言,并定义该语言的文法表示,再设计一个解析器来解释语言中的句子。也就是说,用编译语言的方式来分析应用中的实例。这种模式实现了文法表达式处理的接口,...
章节介绍:1、爪哇语言结构性模式之变压器模式介绍 2、爪哇语言抽象工厂创立性模式介绍 3、工厂方法创立...10、设计模式之State 11、设计模式之Facade(外观) 12、设计模式之Interpreter(解释器) 13、设计模式之Visitor
“Interpreter模式”是设计模式中的一种,主要应用于解决表达式问题,它为特定语言提供了表达式接口,使得程序可以理解和执行这些表达式。在Java中实现Interpreter模式,可以创建一个灵活的、可扩展的解析系统,允许...