解释器模式
给定一个语言,定义他的文法的一个表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
package com.ruishenh.designPatter.action.interpreter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
public class InterpreterClient {
public static void main(String[] args) throws IOException {
String expression = "a+b+c+b"; //创建一个表达式
HashMap<String, Integer> map=new HashMap<String, Integer>(); //对应的表达式参数
map.put("a", 2);
map.put("b", 3);
map.put("c", 4);
Context ctx = new Context();
ctx.setData(map);
for (String str : map.keySet()) {
System.out.println(str+"="+map.get(str));
}
System.out.println(expression+"="+getExpression(expression).interpreter(ctx));
}
//调用解释器解释计算逻辑
static Expression getExpression(String expression){
char[] charArray = expression.toCharArray();
Stack<Expression> stack = new Stack<Expression>();
Expression left = null;
Expression right = null;
for (int i = 0; i < charArray.length; i++) {
switch (charArray[i]) {
case '+':
left = stack.pop();
right = new VarExpression(String.valueOf(charArray[++i]));
stack.push(new AddExp(left, right));
break;
default:
stack.push(new VarExpression(String.valueOf(charArray[i])));
}
}
return stack.pop();
}
}
//环境角色
class Context {
Map<String,Integer> data;
public Map<String, Integer> getData() {
return data;
}
public void setData(Map<String, Integer> data) {
this.data = data;
}
}
abstract class Expression {
public abstract Object interpreter(Context ctx);
}
//终结符表达式
class VarExpression extends Expression {
private String key;
public VarExpression(String key) {
this.key = key;
}
public Object interpreter(Context ctx) {
return ctx.getData().get(key);
}
}
//非终结符表达式
abstract class CalcExpression extends Expression {
protected Expression left;
protected Expression right;
public CalcExpression(Expression left, Expression right) {
this.left = left;
this.right = right;
}
public abstract Object interpreter(Context ctx);
}
class AddExp extends CalcExpression{
public AddExp(Expression left, Expression right) {
super(left, right);
}
@Override
public Object interpreter(Context ctx) {
return Integer.valueOf(left.interpreter(ctx).toString()) + Integer.valueOf(right.interpreter(ctx).toString()) ;
}
}
很好的一篇博文:http://www.cnblogs.com/cbf4life/archive/2009/12/17/1626125.html
因为解释器模式比较特殊,它要写出一个解释器,然后解释器对一些我们预先设定好的公式能够解析,而且对一些业务逻辑和使用规则都得比较了解才能使用。故一般很少使用这种模式。
备忘录模式
在不破坏对象的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
package com.ruishenh.designPatter.action.memento;
public class mementoClient {
public static void main(String[] args) {
Developer dev=new Developer();
//项目未上线前,之前状态良好
dev.setState("状态良好");
System.out.println(dev.getState());
//项目上线之前备份一下之前文件
Maintenance maintenance =new Maintenance();
maintenance.backup(dev.createBak());
//项目上线导致系统崩溃
dev.setState("状态失败,系统停止");
System.out.println(dev.getState());
//马上让运维回滚系统
dev.rollback(maintenance.retrieveData());
System.out.println(dev.getState());
}
}
// 运维管理员
class Maintenance {
Bak bak;
Bak retrieveData() {
return this.bak;
}
void backup(Bak bak) {
this.bak = bak;
}
}
// 备忘录
class Bak {
private String state = "";
public Bak(String state) {
this.state = state;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
// 发起人-开发人员
class Developer {
String state;
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public Bak createBak() {
return new Bak(this.state);
}
public void rollback(Bak bak) {
this.setState(bak.getState());
}
}
备忘录模式核心任务就是把之前对象的之前的一种状态(数据)保留到另外一个载体,等待下一次的应用回调。因为这种载体可能会有很多很对的资源被占用,个人理解以后使用的时候可以考虑设置一个阀值来控制更好地节约资源。
分享到:
相关推荐
c++设计模式-行为型模式-解释器模式;qt工程;c++简单源码; 解释器(Interpreter)模式的定义:给分析对象定义一个语言,并定义该语言的文法表示,再设计一个解析器来解释语言中的句子。也就是说,用编译语言的方式...
设计模式11-行为模式-责任链、命令模式 设计模式12-解释器模式 设计模式13-迭代器模式 设计模式14-中介者模式、备忘录模式 设计模式15-观察者模式、状态模式 设计模式16-策略模式、模板方法、访问者 此PPT实例便于...
1.1 什么是设计模式 2 1.2 Smalltalk MVC 中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 指定对象...
行为型模式+结构型模式+创建型模式:三大设计模式实例剖析与深入解读 行为型模式 备忘录模式 +结构型模式 创建型模式总结 +创建型模式
总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元...
1.2 Smalltalk MVC中的设计模式 1.3 描述设计模式 1.4 设计模式的编目 1.5 组织编目 1.6 设计模式怎样解决设计问题 1.7 怎样选择设计模式 1.8 怎样使用设计模式 第二章 实例研究:设计一个文档编辑器 2.1 设计问题...
具体地, 研究了源码中设计模式抽取的静态结构分析过程, 为了进一步提高设计模式实例抽取的准确率, 对结构分析得到的创建型模式候选, 使用创建对象的多重性分析方法进行验证, 对结构分析得到的行为型模式候选, 使用...
全书共9章,内容包括设计模式基础、创建型设计模式(共5种)、结构型设计模式(共7种)、行为型设计模式(共11种)、设计模式实验指导。每章包括教学目标、重点内容、模式的定义与特点、模式的结构与实现、模式的...
设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代 码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的;设计...
创建型模式,共五种:工厂方法模式、抽象工厂模式、...行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
内容简介:本书设计实例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。 本书分类描述了一组设计良好,表达清楚的软件设计模式,这些模式在实用环境...
本书设计实例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。本书分类描述了一组设计良好,表达清楚的软件设计模式,这些模式在实用环境下有特别有用...
JAVA的23种设计模式实例,如三大类创建型模式、结构型模式、行为型模式,细分为23种具体模式1. 设计模式 3 1.1 创建型模式 4 1.1.1 工厂方法 4 1.1.2 抽象工厂 6 1.1.3 建造者模式 10 1.1.4 单态模式 13 1.1.5 原型...
C#设计模式之适配器模式应用实例
本书结合设计实例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。本书分类描述了一组设计良好、表达清楚的软件设计模式,这些模式在实用环境下特别...
1.1 什么是设计模式 2 1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 指定对象...
内容简介:本书设计实例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。本书分类描述了一组设计良好,表达清楚的软件设计模式,这些模式在实用环境下...
2. **单例模式(Singleton Pattern)**:单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。 3. **观察者模式(Observer Pattern)**:观察者模式是一种行为设计模式,定义了对象间的...
内容简介:本书设计实例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。本书分类描述了一组设计良好,表达清楚的软件设计模式,这些模式在实用环境下...
1.1 什么是设计模式 2 1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 指定对象...