- 浏览: 318105 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (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 789创建型模式 1、FACTORY—追MM少不了请吃饭了,麦当 ... -
易学设计模式14 调停者模式(Mediator)
2012-09-13 14:01 1011调停者模式是对象的行为模式。调停者模式包装了一系列对象相互作用 ... -
易学设计模式13 状态模式(State)
2012-09-08 10:23 849状态模式(State Pattern)是设计模式的一种,属于行 ... -
易学设计模式11 观察者(Observer)
2012-09-06 13:36 917Observer模式是行为模式之一,它的作用是当一个对象的状态 ... -
易学设计模式十 单例序列键生成器
2012-09-04 21:40 815数据库有很多种,例如Oracle,DB2,Sybase,MyS ... -
易学设计模式九 单例模式(Singleton)
2012-09-03 21:41 795单例模式确保某一个类只有一个实例,并且自行实例化向整个系统提供 ... -
易学设计模式八 工厂方法(Factory Method)
2012-09-03 20:57 862工厂方法模式的用意是定义一个创建产品对象的工厂,将实际的创建工 ... -
易学设计模式七 简单工厂(Simple Factory)
2012-09-02 19:45 822简单工厂模式是类的创建模式,又叫做静态工厂方法(Static ... -
易学设计模式六 代理模式(Proxy)
2012-08-30 23:16 774代理模式(Proxy)为另一个对象提供一个替身或占位符以控制对 ... -
易学设计模式五 建造模式(Builder)
2012-08-30 21:34 775遇到多个构造器参数(Constructor Parameter ... -
易学设计模式四 命令模式(Commond)
2012-08-28 16:43 1920命令模式定义 将一个请求封装为一个对象,从而使 ... -
易学设计模式三 装饰模式(Decorator)
2012-08-26 22:31 1133装饰者模式 Decorator模式(别名Wrapper):动态 ... -
易学设计模式二 组合模式(Composite)
2012-08-21 16:02 1038组合模式 将对象组合成树形结构以表示"部分-整体& ... -
易学设计模式一 模板 方法(Template Method)
2012-08-19 22:16 718模版方法:抽象类实现部分逻辑,声明一些抽象方法迫使子类实现剩余 ... -
图说设计模式 (一)Strategy
2012-07-27 11:52 1102很久很久以前, 野鸭(MallardDuck)和 红头鸭(Re ...
相关推荐
解释器模式(Interpreter) 用意:定义一种语言,定义它的方法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
C#面向对象设计模式 (行为型模式) Interpreter 解释器模式 视频讲座下载
给定一个语言, 定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。
在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不... 这是第16节:行为型模式Interpreter解释器模式
Interpreter解释器模式在C#中的实现
Interpreter(解释器)模式.doc
C#面向对象设计模式纵横谈(16):(行为型模式) Interpreter 解释器模式 (Level 300)
☆ 资料说明:☆ 《易学 设计模式》 郭志学 编著 随书源代码 ☆ 章节清单:☆ 第01章 欲速则不达:了解设计模式 ...第26章 望文生义:解释器模式 (Interpreter) 第27章 无招胜有招:如何在设计中应用设计模式
php设计模式 Interpreter(解释器模式),需要的朋友可以参考下。
解释器(Interpreter)模式的定义:给分析对象定义一个语言,并定义该语言的文法表示,再设计一个解析器来解释语言中的句子。也就是说,用编译语言的方式来分析应用中的实例。这种模式实现了文法表达式处理的接口,...
章节介绍:1、爪哇语言结构性模式之变压器模式介绍 2、爪哇语言抽象工厂创立性模式介绍 3、工厂方法创立...10、设计模式之State 11、设计模式之Facade(外观) 12、设计模式之Interpreter(解释器) 13、设计模式之Visitor
创建模式: 设计模式之Factory 设计模式之Prototype(原型) 设计模式之Builder 设计模式之Singleton(单态) 结构模式: 设计模式之Facade(外观) 设计模式之Proxy(代理) ...设计模式之Interpreter(解释器) 设计模式之Visitor
主要介绍了Java设计模式之解释器模式(Interpreter模式)介绍,Interpreter定义:定义语言的文法,并且建立一个解释器来解释该语言中的句子,需要的朋友可以参考下
C++设计模式课件25_Interpreter.pdfC++设计模式课件25_Interpreter.pdf
本文实例讲述了PHP设计模式之解释器(Interpreter)模式。分享给大家供大家参考,具体如下: 解释器模式,它是什么呢? 意思就是,给定一个语言, 定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来...
23种设计模式的java实现之Interpreter,代码实现
设计模式参考文档 创建模式: 设计模式之Factory 设计模式之Prototype(原型) 设计模式之Builder 设计模式之Singleton(单态) 结构模式: 设计模式之Facade(外观) ...设计模式之Interpreter(解释器) 设计模式之Visitor
本文实例讲述了Python设计模式之解释器模式原理与用法。分享给大家供大家参考,具体如下: 解释器模式(Interpreter Pattern):给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释...
C#面向对象设计模式纵横谈(16):(行为型模式) Interpreter 解释器模式 C#面向对象设计模式纵横谈(17):(行为型模式) Mediator 中介者模式 C#面向对象设计模式纵横谈(18):(行为型模式) Iterator 迭代器模式 C#...
第21章 解释器模式(Interpreter) 第22章 装饰模式(Decorator) 第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录...