解释器模式
给定一个语言,定义他的文法的一个表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
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)模式的定义:给分析对象定义一个语言,并定义该语言的文法表示,再设计一个解析器来解释语言中的句子。也就是说,用编译语言的方式...
行为型模式(Behavioral Patterns)是设计模式的一种,关注对象行为功能上的抽象,从而提升对象在行为功能上的可拓展性,能以最少的代码变动完成功能的增减。 在设计模式中,行为型模式主要包括以下几种: 1. 迭代...
设计模式11-行为模式-责任链、命令模式 设计模式12-解释器模式 设计模式13-迭代器模式 设计模式14-中介者模式、备忘录模式 设计模式15-观察者模式、状态模式 设计模式16-策略模式、模板方法、访问者 此PPT实例便于...
设计模式通常分为三类:创建型模式(如工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式),结构型模式(如适配器模式、装饰器模式、代理模式、桥接模式、组合模式、外观模式、享元模式)以及行为型模式(如...
然后,资源对23种设计模式进行了分类和总结,包括创建型模式、结构型模式和行为型模式。 创建型模式(Creational Pattern)对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离。共有5种,...
设计模式分为三大类:创建型模式(如单例、工厂方法、抽象工厂)、结构型模式(如代理、装饰器、适配器)和行为型模式(如观察者、策略、命令)。这些模式都是在特定上下文中解决设计问题的模板,它们可以提高代码的...
设计模式通常分为三类:创建型、结构型和行为型。创建型模式关注对象的创建,结构型模式关注对象的组合,而行为型模式关注对象之间的交互。 工厂模式是创建型设计模式之一,它的主要目的是提供一个创建对象的接口,...
这些模式是由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位大师,通常被称为GoF(Gang of Four),在他们的经典著作《设计模式:可复用面向对象软件的基础》中提出的。这本书详细阐述了23种设计...
Java设计模式是软件工程中的一种重要思想,它总结了在解决特定问题时,程序员们反复使用的一些最佳实践和解决方案。这个资源"Java设计模式----通俗易懂版"显然是一个专门针对初学者或需要深入理解设计模式的开发者...
设计模式分为三类:创建型模式、结构型模式和行为型模式。创建型模式关注对象的创建过程,如单例模式(Singleton)、工厂模式(Factory)和建造者模式(Builder)等,它们提供了一种灵活的方式来创建和管理对象,...
2. **设计模式分类**:设计模式通常分为三类:创建型模式(如工厂方法、抽象工厂、单例、建造者、原型)、结构型模式(如适配器、桥接、装饰、组合、代理、外观、享元)和行为型模式(如责任链、命令、解释器、迭代...
这个压缩包文件名为“23种设计模式示例源码”,暗示其中包含了解决23种经典设计模式的具体实现代码,这对于初学者或者希望深入理解设计模式的开发者来说是一份宝贵的资源。下面将对这23种设计模式进行详细解释。 1....
全书共9章,内容包括设计模式基础、创建型设计模式(共5种)、结构型设计模式(共7种)、行为型设计模式(共11种)、设计模式实验指导。每章包括教学目标、重点内容、模式的定义与特点、模式的结构与实现、模式的...
设计模式的起源可以追溯到20世纪90年代,由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位大师共同编著的《设计模式:可复用面向对象软件的基础》一书中提出。他们总结了23种经典的设计模式,这些...
设计模式(创建型、结构型、行为型) 设计模式是软件设计中的一种重要概念,它们可以帮助开发者更好地设计和实现软件系统。根据GoF(Gang of Four)的分类,设计模式可以分为三大类:创建型、结构型和行为型。 ...