Wzorce projektowe: Interpreter

Interpreter jest wzorcem projektowym, którego zadaniem jest interpretacja poleceń innego języka. Dany język rokładany jest na części gramatyczne i potem na zorientowaną obiektowo hierarchię.

Interpreter składa się : Context: który przetrzymuje dane, które powinny poddać się interpretacji, Abstract Expression: klasa abstrakcyjna która interpretuje polecenia, …. Expression – konkretne klasy, które interpretują treść Contextu dla poszczególnych przypadków.

Interface Expression

package pl.roboczenotatki.designpatterns.Interpreter;

import java.util.Stack;

public interface Expression {

	public void interpret(Stack<Integer> context);
}

Klasa MinusExpression

package pl.roboczenotatki.designpatterns.Interpreter;

import java.util.Stack;

public class MinusExpression implements Expression {

	public void interpret(Stack<Integer> context) {
		context.push(-context.pop() + context.pop());
	}

}

Klasa PlusExpression

package pl.roboczenotatki.designpatterns.Interpreter;

import java.util.Stack;

public class PlusExpression implements Expression{

	public void interpret(Stack<Integer> context) {
		context.push(context.pop() + context.pop());
	}
}

Klasa NumberExpression

package pl.roboczenotatki.designpatterns.Interpreter;

import java.util.Stack;

public class NumberExpression implements Expression {

	private Integer i;

	public NumberExpression(Integer i) {
		super();
		this.i = i;
	}

	public void interpret(Stack<Integer> context) {
		context.add(i);
	}
}

Klasa Client

package pl.roboczenotatki.designpatterns.Interpreter;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.Stack;

/**
 * Wzorzec interpreter
 */
public class Client {

	public static void main(String[] args) {
		String in = "42 4 2 - +"; // zapis w ONP, powinno wyjsc 44, dla 2 2 + =
									// 4
		Stack<Integer> context = new Stack<Integer>();

		// budujemy drzewo parsowania
		ArrayList<Expression> parseTree = new ArrayList<Expression>();
		for (String s : in.split(" ")) {
			switch (s) {
			case "+":
				parseTree.add(new PlusExpression());
				break;
			case "-":
				parseTree.add(new MinusExpression());
				break;
			default:
				parseTree.add(new NumberExpression(Integer.parseInt(s)));
				break;
			}
		}

		for (Iterator iterator = parseTree.iterator(); iterator.hasNext();) {
			Expression expression = (Expression) iterator.next();
			expression.interpret(context);
		}
		System.out.println(in + " = " + context.pop());

	}
}

Diagram wzorca:
interpreter

Reklamy

Wzorce projektowe

Katalog wzorców projektowych Gang of Four (Gamma,Johnson, Helm, Vlissides) obejmuje 23 wzorce:

– kreacyjne: Abstract Factory, Builder, Factory Method, Prototype, Singleton
– strukturalne: Adapter, Bridge, Composite, Decorator,Composite, Facade, Proxy, Flyweight
– behawioralne: Chain of Responsibility, Command,Interpreter, Mediator, Iterator, Memento, Observer,