I. Wzorce kreacyjne
1. Singleton
2. Budowniczy
3. Prototyp
4. Fabryka
5. Fabryka abstrakcyjna
II. Wzorce strukturalne
1. Adapter
2. Most
3. Kompozyt
4. Dekorator
5. Fasada
6. Pyłek
7. Pełnomocnik
III. Wzorce czynnościowe
1. Łańcuch zobowiązań
2. Polecenie
3. Interpreter
4. Iterator
5. Mediator
6. Pamiątka
7. Obserwator
8. Stan
9. Strategia
10. Metoda szablonowa
11. Odwiedzający

Interpreter - wzorzec projektowy (design pattern) - java

1. Cel:
Wzorzec Interpreter używamy do reprezentowania gramatyki języka.
Wiele narzędzi używa tego wzorca podczas analizowania różnych aspektów gramatyki.
2. Problem:
Mamy do zinterpretowania gramatykę, może to być notacja muzyczna
lub równania matematyczne, lub nawet w inny język.
Kompilatory często używają wzorca Interpreter by analizować kod źródłowy.
Na przykład kompilator javy interpretuje kod źródłowy do kodu bitowego.
Interpretor to tłumasz, translator.
Google translator to drugi przykład wzorca interpretor.

3. Rozwiązanie:
Implentujemy abstrakcyjne wyrażenie (expression) do wykonania operacji.
Ta operacja to metoda do interpretacji.
Wyrażenie jest podziezlone na wyrażenie końcowe (terminal expression) które jest liściem drzewa,
lub po prostu nie zawiera innego wyrażenia oraz wyrażenia które nie są końcowe
tzn. złożone z co najmniej jednego, które jest wykonane rekursywnie dopóki będzie końcowe.
Tworzymy jedną klase per role.

4. Diagram klas wzorca Interpreter:


5. Implementacja:
Klasa testująca:
  1. public class InterpreterTest {
  2.  
  3. //Rola: Mateusz i Tomasz są mężczyznami
  4. public static Expression getMaleExpression(){
  5. Expression mateusz = new TerminalExpression("Mateusz");
  6. Expression tomasz = new TerminalExpression("Tomasz");
  7. return new OrExpression(mateusz, tomasz);
  8. }
  9.  
  10. //Rola: Julia jest żoną
  11. public static Expression getMarriedWomanExpression(){
  12. Expression julia = new TerminalExpression("Julia");
  13. Expression żona = new TerminalExpression("żona");
  14. return new AndExpression(julia, żona);
  15. }
  16.  
  17. public static void main(String[] args) {
  18. Expression isMale = getMaleExpression();
  19. Expression isMarriedWoman = getMarriedWomanExpression();
  20.  
  21. System.out.println("John is male? " + isMale.interpret("John"));
  22. System.out.println("Julia to żona Mateusza" ? " + isMarriedWoman.interpret("Julia to żona Mateusza"));
  23. }
  24. }
Implementacja wzorca:
  1. public interface Expression {
  2. public boolean interpret(String context);
  3. }
  4.  
  5. public class TerminalExpression implements Expression {
  6.  
  7. private String data;
  8.  
  9. public TerminalExpression(String data){
  10. this.data = data;
  11. }
  12.  
  13. @Override
  14. public boolean interpret(String context) {
  15. return context.contains(data);
  16. }
  17. }
  18.  
  19. public class OrExpression implements Expression {
  20.  
  21. private Expression expr1;
  22. private Expression expr2;
  23.  
  24. public OrExpression(Expression expr1, Expression expr2) {
  25. this.expr1 = expr1;
  26. this.expr2 = expr2;
  27. }
  28.  
  29. @Override
  30. public boolean interpret(String context) {
  31. return expr1.interpret(context) || expr2.interpret(context);
  32. }
  33. }
  34.  
  35. public class AndExpression implements Expression {
  36.  
  37. private Expression expr1;
  38. private Expression expr2;
  39.  
  40. public AndExpression(Expression expr1, Expression expr2) {
  41. this.expr1 = expr1;
  42. this.expr2 = expr2;
  43. }
  44.  
  45. @Override
  46. public boolean interpret(String context) {
  47. return expr1.interpret(context) && expr2.interpret(context);
  48. }
  49. }
6. Zastosowanie w kodzie java:
- java.util.Pattern
- java.text.Normalizer
- java.text.Format
created by cv.java.org.pl © 2023 All Rights Reserved.