예시
Expression(InterfFace) : interpret 메서드를 정의 한다.
TerminalExpression : interpret(구문)의 마지막 로직을 담당하거나 받은데이터를 단순하게 리턴해주는기능을 수행한다.
NonTerminalExpression : interpret의 각요소를 의미하고 체인 형태로 처리후 다른 Expression으로 전달한다.
Context : 인터프리터가 구문해석을 실행하기 위한 정보를 제공하는 객체이다.
Client : interpret 메소드 호출
/**
* Invoker
*/
public interface PostfixExpression {
/**
* class를 늘리지 않고 Lambda Expressions를 이용한 확장방법
* */
/*
static PostfixExpression plus(PostfixExpression left, PostfixExpression right) {
return context -> left.interpret(context) + right.interpret(context);
}
static PostfixExpression minus(PostfixExpression left, PostfixExpression right) {
return context -> left.interpret(context) - right.interpret(context);
}
static PostfixExpression variable(Character c) {
return context -> context.get(c);
}
*/
int interpret(Map<Character, Integer> context);
}
/**
* NonTerminalExpression
*/
public class PlusExpression implements PostfixExpression {
private PostfixExpression left, right;
public PlusExpression(PostfixExpression left, PostfixExpression right) {
this.left = left;
this.right = right;
}
@Override
public int interpret(Map<Character, Integer> context) {
return left.interpret(context) + right.interpret(context);
}
}
public class PostfixParser {
public static PostfixExpression parse(String expression) {
Stack<PostfixExpression> stack = new Stack<>();
for (char c : expression.toCharArray()) {
stack.push(getExpression(c, stack));
}
return stack.pop();
}
private static PostfixExpression getExpression(char c, Stack<PostfixExpression> stack) {
switch (c) {
case '+':
return new PlusExpression(stack.pop(), stack.pop());
case '-':
PostfixExpression right = stack.pop();
PostfixExpression left = stack.pop();
return new MinusExpression(left, right);
default:
return new VariableExpression(c);
}
}
/**
* class를 늘리지 않고 Lambda Expressions를 이용한 확장방법
* */
/* private static PostfixExpression getExpression(char c, Stack<PostfixExpression> stack) {
switch (c) {
case '+':
return plus(stack.pop(), stack.pop());
case '-':
PostfixExpression right = stack.pop();
PostfixExpression left = stack.pop();
return minus(left, right);
default:
return variable(c);
}
}*/
}
/**
* TerminalExpression
* */
public class VariableExpression implements PostfixExpression {
private Character variable;
public VariableExpression(Character variable) {
this.variable = variable;
}
@Override
public int interpret(Map<Character, Integer> context) {
return context.get(variable);
}
}
/**
* Client
* */
public class Client {
public static void main(String[] args) {
PostfixExpression expression = PostfixParser.parse("xyz+-");
//파서가 있어야함 파서를 하면 Expression이 나옴
//Map은 일종의 context
int interpret = expression.interpret(Map.of('x', 1, 'y', 2, 'z', 3));
System.out.println(interpret);
}
}
public class InJava {
public static void main(String[] args) {
System.out.println(Pattern.matches(".pr...", "spring"));
System.out.println(Pattern.matches("[a-z]{6}", "spring"));
System.out.println(Pattern.matches("kkk[a-z]{6}[0-9]{4}", "kkkspring1234"));
}
}
/** 결과값
* true
* true
* true
* */
public class InSpring {
public static void main(String[] args) {
Book book = new Book("doong");
ExpressionParser parser = new SpelExpressionParser();
Expression expression = parser.parseExpression("testMethod");
Expression expression2 = parser.parseExpression("name");
/**
* Book의 name filed를 리턴 , testMethod 실행
* */
System.out.println("expression.getValue(book) = " + expression.getValue(book));
System.out.println(expression2.getValue(book));
}
}
출처 : 백기선님의 디자인패턴