Java에서 Interpreter Design Pattern을 이해하려고합니다. Wikipedia 에서 다음 코드를 받고 있습니다. 쓰여있다
interface Expression {
public int interpret(Map<String,Expression> variables);
}
Expression이 Type Expression의 Interface 안에있는 Map의 값인 것에 대해 여기서 무슨 일이 일어나고 있는지 설명해 주시겠습니까? 재귀 호출과 같은 것입니까? 친절하게 설명하십시오.
귀하의 질문에 답하기 위해 예, 동일한 함수 interpret()
가 반복해서 호출되지만 동일한 클래스가 아닙니다. 따라서 실제로 재귀 함수가 아닙니다.
인터프리터 패턴을 설명하기 위해 위키 코드를 사용했지만 전체 그림을 이해하려면 위키 페이지로 이리저리 이동해야합니다.
http://en.wikipedia.org/wiki/Interpreter_pattern
인터프리터 패턴은 주어진 표현식의 각 변수와 연산자가 별도의 클래스로 표현 된 다음 이러한 클래스의 객체에서 평가가 발생하는 패턴입니다.
표현 - class, expression - ((y+z)-x)
지적한 위키 예제의 경우에서 Evaluator의 생성자를 호출하면 main()
식만 생성되고 (또 다른 Expression 개체) syntaxTree
Evaluator 의 참조 변수에 저장됩니다 .
표현으로 거기에서 일어나는 일의 요점을 제공하려면 : x y z + -
x,y,z
에서와 같은 저장되는 expressionStack
변수+
, (y+z)
안으로 밀려날 것입니다expressionStack
-
토큰 후 ((y+z)-x)
Expression 객체는 expressionStack
(에서 연산자에 대해 발생하는 푸시 및 팝 확인 Evaluator
)따라서 Evaluator의 생성자가 완료되면 구현이 다시 Expression으로 표시되는 Expression 객체를 갖게됩니다 ((y+z)-x)
.
이제에서 흥미로운 부분이 나옵니다. 클래스를 사용 main()
하여 변수 값을 대체 하고이 순서로 발생합니다.(x,y,z)
Number
main () sentence.interpret(variables);
Evaluator.syntaxTree.interpret(variables);
Variable.interpret(variables) // Here the actual values(5,10,42) gets substituted for x, y, z.
그런 다음 Expression
평가됩니다.
당신이 볼 경우 interpret()
의 Variables
클래스는 해당 얻을 경우, 그것은 약간 다릅니다 Number
전달 된 컨텍스트를 사용하여, 변수의 객체를. 이것은 전달 된 컨텍스트 객체를 사용하여 숫자에 대한 변수의 실제 대체입니다 main()
. 이 차례로 호출 interpret()
의 Number
단지 수를 반환하고 작업이로 발생 ((10+5)-42) = -27
.
이 기술을 사용하면 기존 작업에 영향을주지 않고 작업 (더하기, 빼기)을 계속 추가 할 수 있으며 한 작업은 다른 작업과 독립적입니다. SQL 쿼리 및 기타 인터프리터에서 사용됩니다.
감사합니다, Prasanna V.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다